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

voj3qocg  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(112)

我正在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']

pod7payv

pod7payv1#

在下面使用(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

带输出

mefy6pfw

mefy6pfw2#

当正则表达式解析器walks down the string的每个位置都被消耗。要提取具有相同起始位置的子字符串,需要 * lookbehind *,capture匹配朝向起始位置。捕获overlapping matches需要在lookaround内完成,以避免消耗捕获的部分。Python re不支持可变长度的lookbehind,但PyPI regex支持。

import regex as re

res = re.findall(r"(?<=(.*\d(?:\.|$)))", s)

请参见www.example.com或a Regex101 demo上的Python演示tio.run(捕获将在 * 第一组 * 中)。
在PyPI中甚至有一个overlapped=True * 选项 *,它允许 * 避免 * 在lookbehind中捕获。与(?r)一起,还可以实现另一个有趣的标记,用于执行 * 反向搜索 *。

res = re.findall(r'(?r).*\d(?:\.|$)', s, overlapped=True)[::-1]

结果只需为reversed即可接收所需的订单:Python演示
使用标准的re,一个想法可以是reverse the string并在一个lookahead 中进行捕获。从反转的字符串中捕获所需的部分,最后在反转整个列表之前再次反转每个列表项。我不知道这是否值得,但似乎也很有效。

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

www.example.com上的另一个Python演示tio.run或Regex101 demo(显示反转字符串的匹配)。

相关问题