RegExp match repeated characters
You can match that with: (\w)\1*
itertools.groupby
is not a RexExp, but it's not self-written either. :-) A quote from python docs:
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
Generally
The trick is to match a single char of the range you want, and then make sure you match all repetitions of the same character:
>>> matcher= re.compile(r'(.)\1*')
This matches any single character (.
) and then its repetitions (\1*
) if any.
For your input string, you can get the desired output as:
>>> [match.group() for match in matcher.finditer('aacbbbqq')]
['aa', 'c', 'bbb', 'qq']
NB: because of the match group, re.findall
won't work correctly.
Other ranges
In case you don't want to match any character, change accordingly the .
in the regular expression:
>>> 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
Check the latter against u'hello²²'
(Python 2.x) or 'hello²²'
(Python 3.x):
>>> text= u'hello=\xb2\xb2'
>>> print('\n'.join(match.group() for match in matcher.finditer(text)))
h
e
ll
o
²²
\w
against non-Unicode strings / bytearrays might be modified if you first have issued a locale.setlocale
call.