使用正则表达式查找所有出现的交替数字

时间:2016-01-03 05:28:35

标签: python regex string

我想使用正则表达式找到字符串中的所有交替数字。交替数字被定义为两个相等的数字,其间具有数字;例如,1212包含2个交替(121和212),1111包含2个交替(111和111)。我有以下正则表达式代码:

s = "1212"
re.findall(r'(\d)(?:\d)(\1)+', s)

这适用于像“121656”这样的字符串,但不适用于“1212”。这与我认为的重叠匹配有关。我该如何处理?

4 个答案:

答案 0 :(得分:13)

(?=((\d)\d\2))

使用lookahead获取所有重叠匹配。使用re.findall并从元组中获取第一个元素。参见演示:

https://regex101.com/r/fM9lY3/54

答案 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']

它实际上比正则表达式方法快得多。