[英]Finding all occurrences of alternating digits using regular expressions
我想使用正则表达式找到字符串中的所有交替数字。 交替数字被定义为两个相等的数字,其间具有数字; 例如,1212包含2个交替(121和212),1111包含2个交替(111和111)。 我有以下正则表达式代码:
s = "1212"
re.findall(r'(\d)(?:\d)(\1)+', s)
这适用于像“121656”这样的字符串,但不适用于“1212”。 这与我认为的重叠匹配有关。 我该怎么处理?
您可以使用前瞻来允许重叠匹配:
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']
它实际上比正则表达式方法快得多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.