可以使用正则表达式找到具有相同起始位置的重叠匹配吗?

问题描述 投票:0回答:2

我正在 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 python-3.x regex google-bigquery findall
2个回答
0
投票

使用下面(BigQuery)

select text, 
  array(
    select regexp_extract(text, r'((?:[^.]+.){' || i || '})')
    from unnest(generate_array(1, array_length(split(text, '.')))) i
  ) as extracted
from your_table               

有输出

enter image description here


0
投票

当正则表达式解析器沿着字符串向下走时每个位置都会被消耗。要提取具有相同起始位置的子字符串,需要“向后查找”并“捕获”开头的匹配项。捕获“重叠匹配”需要在环视中完成,以免消耗捕获的部分。 Python re 不支持可变长度的lookbehind,但 PyPI regex 支持。 import regex as re res = re.findall(r"(?<=(.*\d(?:\.|$)))", s)

请参阅 tio.run 上的 Python 演示或 

Regex101 演示
(捕获将位于
第一组

)。 在 PyPI 中甚至还有一个 overlapped=True

选项

,它可以让 avoid

 捕获回溯内部。与 
(?r) 另一个有趣的标志一起进行 反向搜索 也可以实现。
res = re.findall(r'(?r).*\d(?:\.|$)', s, overlapped=True)[::-1]
之后只需将结果反转即可获得所需的顺序:

Python演示

使用标准re,一个想法可以是反转字符串

并在look
ahead

中进行捕获。从反转的字符串中捕获所需的部分,最后在反转整个列表之前再次反转每个列表项。我不知道这是否值得付出努力,但似乎也有效。

res = [x[::-1] for x in re.findall(r'(?=((?:\.\d|^).*))', s[::-1])][::-1]

tio.run 的另一个 Python 演示

Regex101 演示
(显示反向字符串的匹配)。

© www.soinside.com 2019 - 2024. All rights reserved.