我正在 python/BigQuery 中寻找正则表达式或正则表达式标志,使我能够找到重叠的出现情况。
例如,我有字符串
1.2.5.6.8.10.12
我想提取:
[1., 1.2., 1.2.5., 1.2.5.6., ..., 1.2.5.6.8.10.12]
我尝试运行Python代码
re.findall("^(\d+(?:\.|$))+", string)
结果是 ['12']
当正则表达式解析器沿着字符串向下走时每个位置都会被消耗。要提取具有相同起始位置的子字符串,需要“向后查找”并“捕获”开头的匹配项。捕获“重叠匹配”需要在环视中完成,以免消耗捕获的部分。 Python re
不支持可变长度的lookbehind,但 PyPI regex 支持。
import regex as re
res = re.findall(r"(?<=(.*\d(?:\.|$)))", s)
(捕获将位于第一组
)。
在 PyPI 中甚至还有一个 overlapped=True
,它可以让 avoid
捕获回溯内部。与
(?r)
另一个有趣的标志一起进行 反向搜索 也可以实现。
res = re.findall(r'(?r).*\d(?:\.|$)', s, overlapped=True)[::-1]
之后只需将结果反转即可获得所需的顺序:Python演示
并在look中进行捕获。从反转的字符串中捕获所需的部分,最后在反转整个列表之前再次反转每个列表项。我不知道这是否值得付出努力,但似乎也有效。
res = [x[::-1] for x in re.findall(r'(?=((?:\.\d|^).*))', s[::-1])][::-1]
tio.run 的另一个 Python 演示 或 Regex101 演示(显示反向字符串的匹配)。