>>> [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
²²
7条答案
按热度按时间3bygqnnd1#
您可以将其匹配为:
(\w)\1*
xoefb8l82#
itertools.groupby
不是RexExp,但它也不是自写的。:-)引用Python文档:hiz5n14c3#
一般
诀窍是匹配所需范围的单个字符,然后确保匹配相同字符的所有重复:
这匹配任何单个字符(
.
),然后匹配它的重复(\1*
)(如果有的话)。对于输入字符串,您可以获得所需的输出:
注意:由于匹配组的原因,
re.findall
将无法正常工作。其他范围
如果你不想匹配 * 任何 * 字符,那么在正则表达式中相应地修改
.
:对照
u'hello²²'
(Python 2.x)或'hello²²'
(Python 3.x):\w
对非Unicode字符串/字节数组可能会被修改,如果你第一次发出locale.setlocale
调用。ecfsfe2w4#
这将起作用,请参阅此处的工作示例:http://www.rubular.com/r/ptdPuz0qDV
goucqfw65#
如果你像这样捕获反向引用,findall方法将工作:
uz75evzq6#
您可以用途:
输出将是:
0vvn1miw7#
你可以试试这样的方法:
输出将是: