繁体   English   中英

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

[英]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”。 这与我认为的重叠匹配有关。 我该怎么处理?

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

使用前瞻来获得所有重叠的匹配。 使用re.findall并从元组中获取第一个元素。 看演示:

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

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM