Python 沿非重复字符之间的边界拆分字符串
我想用Python按非重复字符之间的边界分割字符串。我写了这个正则表达式:Python 沿非重复字符之间的边界拆分字符串,python,regex,string,split,Python,Regex,String,Split,我想用Python按非重复字符之间的边界分割字符串。我写了这个正则表达式: (?<=(.))(?!\\1)', string) (?如果您对非正则表达式解决方案持开放态度,这是一个完美的应用程序 “为什么”很简单:在Python中,正如在Perl、Ruby和JavaScript中一样,在传递给split的模式中使用捕获组意味着您希望在返回的数组中包含在那里捕获的任何内容。当您希望允许多个分隔符,但能够分辨每个位置使用了哪些分隔符时,这非常有用。但是,这意味着如果你尝试做一些像你的例子那样
(?<=(.))(?!\\1)', string)
(?如果您对非正则表达式解决方案持开放态度,这是一个完美的应用程序
“为什么”很简单:在Python中,正如在Perl、Ruby和JavaScript中一样,在传递给split
的模式中使用捕获组意味着您希望在返回的数组中包含在那里捕获的任何内容。当您希望允许多个分隔符,但能够分辨每个位置使用了哪些分隔符时,这非常有用。但是,这意味着如果你尝试做一些像你的例子那样的花哨的事情,你会得到额外的结果。你的正则表达式必须捕获每个重复的字符以检测其重复,但是split
不能判断这些捕获对它没有好处,所以它在返回的数组中包含这些单个字符串
但是,此结果是完全可预测的。返回的数组将包括您想要的部分,后面是由重复组成的单个字符。因此,您可以始终只使用偶数元素来获得所需的结果:
>>> re.split(r'(?<=(.))(?!\1)', string)[::2]
['aaa', 'b', '44', '7777', 'BBBB', 'bbb', '']
为什么不匹配它们呢?(.)\\1*
我想你可以使用split和regex模块来实现这一点或者你需要一个解决方案/修复程序吗?两者都需要。我需要一个解决方案,并试图理解为什么这不起作用。顺便说一句,regex、my和第四只鸟都在这个网站regex101.com上工作,但不在python脚本中工作。()\使用re.finditer
,1
就足够了。只有在拆分时,使用捕获组包装整个模式才有意义,目的是在结果中保留分隔符。这一点很好。更新了!这一点很好,我没有考虑groupby。
re.findall('(?<=(.))(?!\\1)', string)
>>> [''.join(g) for k, g in groupby('aaab447777BBBBbbb')]
['aaa', 'b', '44', '7777', 'BBBB', 'bbb']
>>> re.split(r'(?<=(.))(?!\1)', string)[::2]
['aaa', 'b', '44', '7777', 'BBBB', 'bbb', '']
>>> [m[0] for m in re.finditer(r'(.)\1*', string)]
['aaa', 'b', '44', '7777', 'BBBB', 'bbb']