使用Python和regex从一组分隔符中首次出现拆分字符串

首先,问题是用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()来转义特殊的正则表达式字符(如*).

相关文章

在这篇文章中,我们深入学习了XPath作为一种常见的网络爬虫技巧。XPath是一种用于定位和选择XML文档中特...
祝福大家龙年快乐!愿你们的生活像龙一样充满力量和勇气,愿你们在新的一年里,追逐梦想,勇往直前,不...
今天在爬虫实战中,除了正常爬取网页数据外,我们还添加了一个下载功能,主要任务是爬取小说并将其下载...
完美收官,本文是爬虫实战的最后一章了,所以尽管本文着重呈现爬虫实战,但其中有一大部分内容专注于数...
JSON是一种流行的数据传输格式,Python中有多种处理JSON的方式。官方的json库是最常用的,它提供了简单...
独立样本T检验适用于比较两组独立样本的均值差异,而配对T检验则适用于比较同一组样本在不同条件下的均...