首先,问题是用Python和正则表达式标记的,但它并没有真正与之相关 – 答案可能是高级别的.
目前我正在使用以下模式拆分带有多个分隔符的字符串.实际上有更多的分隔模式,它们更复杂,但让它保持简单并将它们限制为2个字符 – #和*:
parts = re.split(‘#| *’,string)
哪种方法将字符串aaa #bbb * ccc #ddd拆分为4个子字符串aaa,bbb,ccc,ddd.但是需要通过首先出现在字符串中的分隔符或字符串中最常出现的分隔符进行分割. aaa #bbb * ccc #ddd应拆分为aaa,bbb * ccc,ddd和aaa * bbb #ccc * ddd应拆分为aaa,bbb#ccc,ddd.
我知道一种直接的方法来实现这一点 – 找到首先出现的分隔符,或者是字符串中最常出现的分隔符,然后用该单个分隔符进行分割.但是该方法必须高效,我想知道是否有可能通过单个正则表达式实现这一点.问题主要在于拆分第一次出现的分隔符 – 对于最常见的分隔符情况,几乎可以确定需要提前计算出现次数.
更新:
问题并没有要求同时拆分第一次出现或最常见的定界符 – 这些方法中的任何一种都是足够的.我确实理解,在没有初步确定分隔符的情况下,使用正则表达式进行拆分是不可能的,但我认为有可能在没有提前准备的情况下使用正则表达式和前瞻进行第一次出现的分割.
it is required to split either by a delimiter that occurs first in the string or by a delimiter that is most frequent in the string.
因此,您可以首先找到所有分隔符并将它们保存在一个合适的容器中,然后找到最常见的第一个分区,然后根据它们分割字符串.
现在要查找分隔符,您需要根据特定功能将它们与纯文本分开,例如,如果它们不是单词字符,并且为了保留它们,我们可以使用字典来保留类似分隔符的数量(在这种情况集合.Counter()将完成这项工作).
演示:
>>> s = "aaa#bbb*ccc#ddd*rkfh^ndjfh*dfehb*erjg-rh@fkej*rjh"
>>> delimiters = re.findall(r'\W',s)
>>> first = delimiters[0]
'#'
>>> Counter(delimiters)
Counter({'*': 5,'#': 2,'@': 1,'-': 1,'^': 1})
>>>
>>> frequent = Counter(delimiters).most_common(1)[0][0]
'*'
>>> re.split(r'\{}|\{}'.format(first,frequent),s)
['aaa','bbb','ccc','ddd','rkfh^ndjfh','dfehb','erjg-rh@fkej','rjh']
请注意,如果您正在处理多个字符的分隔符,则可以使用re.escape()来转义特殊的正则表达式字符(如*).