Python 使用正则表达式查找交替数字的所有匹配项

Python 使用正则表达式查找交替数字的所有匹配项,python,regex,string,Python,Regex,String,我想使用正则表达式查找字符串中的所有交替数字。交替数字定义为两个相等的数字,中间有一个数字;例如,1212包含2个备选方案(121和212),1111也包含2个备选方案(111和111)。我有以下正则表达式代码: s = "1212" re.findall(r'(\d)(?:\d)(\1)+', s) 这适用于“121656”之类的字符串,但不适用于“1212”。我认为这是一个与重叠比赛有关的问题。我该怎么处理呢 (?=((\d)\d\2)) 用于获取所有重叠的匹配项。使用re.findal

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

s = "1212"
re.findall(r'(\d)(?:\d)(\1)+', s)
这适用于“121656”之类的字符串,但不适用于“1212”。我认为这是一个与重叠比赛有关的问题。我该怎么处理呢

(?=((\d)\d\2))
用于获取所有重叠的匹配项。使用
re.findall
并从元组中获取第一个元素。请参见演示:


您可以使用前瞻来允许重叠匹配:

r'(\d)(?=(\d)\1)'
要从此数据库重建完全匹配,请执行以下操作:

matches = re.findall(r'(\d)(?=(\d)\1)', s)
[a + b + a for a, b in matches]
此外,为了避免像١这样的其他Unicode数字被匹配(假设您不需要它们),您应该使用
[0-9]
而不是
\d

,您不必使用技巧来获得重叠匹配,因为有一个标志来获取它们:

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]]

如果字符串仅由数字组成,则为非正则表达式方法:

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

它实际上比正则表达式方法快一点

为了匹配他的问题,我会使用
(\d)(?=(?:\d)(\1))
@Roy我想他想要
121和212
,而不是@vks给出的
1或2
具体答案;另见类似问题的答案@。