正则表达式匹配重复字符

2024-05-17 06:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我有字符串:

 aacbbbqq

因此,我希望有以下匹配项:

 (aa, c, bbb, qq)  

我知道我可以写这样的东西:

 ([a]+)|([b]+)|([c]+)|...  

但我觉得我很丑,在寻找更好的解决办法。我在寻找正则表达式的解,而不是自己编写的有限状态机。


Tags: 字符串aaqq状态机bbb解决办法aacbbbqq
3条回答

一般

诀窍是匹配所需范围的单个字符,然后确保匹配同一字符的所有重复:

>>> matcher= re.compile(r'(.)\1*')

它匹配任何单个字符(.),如果有,则匹配其重复(\1*)。

对于输入字符串,您可以获得所需的输出:

>>> [match.group() for match in matcher.finditer('aacbbbqq')]
['aa', 'c', 'bbb', 'qq']

注意:由于匹配组,re.findall将无法正常工作。

其他范围

如果您不想匹配任何字符,请相应地更改正则表达式中的.

>>> matcher= re.compile(r'([a-z])\1*') # only lower case ASCII letters
>>> matcher= re.compile(r'(?i)([a-z])\1*') # only ASCII letters
>>> matcher= re.compile(r'(\w)\1*') # ASCII letters or digits or underscores
>>> matcher= re.compile(r'(?u)(\w)\1*') # against unicode values, any letter or digit known to Unicode, or underscore

对照u'hello²²'(Python 2.x)或'hello²²'(Python 3.x)检查后者:

>>> text= u'hello=\xb2\xb2'
>>> print('\n'.join(match.group() for match in matcher.finditer(text)))
h
e
ll
o
²²

如果您首先发出了一个^{}调用,则可能会修改针对非Unicode字符串的\w/bytearray。

itertools.groupby不是RexExp,但也不是自写的。:-)来自python文档的引用:

# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

您可以将其与:(\w)\1*匹配

相关问题 更多 >