And*_*hev 5 python regex split
首先,问题被标记为Python,regex但它并没有真正与那些相关 - 答案可能是高水平的.
目前我正在使用以下模式拆分带有多个分隔符的字符串.实际上有更多的分隔模式,它们更复杂,但让它保持简单并将它们限制为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.
我知道一种直接的方法来实现这一点 - 找到首先出现的分隔符,或者是字符串中最常出现的分隔符,然后用该单个分隔符进行分割.但是该方法必须高效,我想知道是否有可能通过单个正则表达式实现这一点.问题主要在于拆分第一次出现的分隔符 - 对于最常见的分隔符情况,几乎可以确定需要提前计算出现次数.
更新:
问题并没有要求同时拆分第一次出现或最常见的定界符 - 这些方法中的任何一种都是足够的.我确实理解,在没有初步确定分隔符的情况下,使用正则表达式进行拆分是不可能的,但我认为有可能在没有提前准备的情况下使用正则表达式和前瞻进行第一次出现的分割.
需要按字符串中第一个出现的分隔符或字符串中最常见的分隔符进行拆分。
因此,您可以首先找到所有分隔符并将它们及其频率保存在适当的容器中,然后找到最常见的第一个分隔符,然后根据它们拆分字符串。
现在,为了查找分隔符,您需要根据特定特征将它们与纯文本分开,例如,如果它们不是单词字符,并且为了保留它们,我们可以使用字典来保留类似分隔符的计数(在这个案例collections.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']
Run Code Online (Sandbox Code Playgroud)
请注意,如果您处理的分隔符超过一个字符,则可以使用它re.escape()来转义特殊的正则表达式字符(例如*)。
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |