我想使用正则表达式找到字符串中的所有交替数字。交替数字被定义为两个相等的数字,其间具有数字;例如,1212包含2个交替(121和212),1111包含2个交替(111和111)。我有以下正则表达式代码:
s = "1212"
re.findall(r'(\d)(?:\d)(\1)+', s)
这适用于像“121656”这样的字符串,但不适用于“1212”。这与我认为的重叠匹配有关。我该如何处理?
答案 0 :(得分:13)
答案 1 :(得分:3)
您可以使用前瞻来允许重叠匹配:
r'(\d)(?=(\d)\1)'
从此重建完整匹配:
matches = re.findall(r'(\d)(?=(\d)\1)', s)
[a + b + a for a, b in matches]
另外,为避免匹配其他Unicode数字(假设您不需要它们),您应该使用[0-9]
代替\d
。
答案 2 :(得分:3)
使用regex module你不必使用技巧来获得重叠的匹配,因为有一个标志来获取它们:
import regex
res = [x.group(0) for x in regex.finditer(r'(\d)\d\1', s, overlapped=True)]
如果s只包含数字,你也可以这样做:
res = [s[i-2:i+1] for i in range(2, len(s)) if s[i]==s[i-2]]
答案 3 :(得分:2)
如果你的字符串只由数字组成,则采用非正则表达式方法:
from itertools import islice as isl, izip
s = "121231132124123"
out = [a + b + c for a, b, c in zip(isl(s, 0, None), isl(s, 1, None), isl(s, 2, None)) if a == c]
输出:
['121', '212', '212']
它实际上比正则表达式方法快得多。