我正在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']
1.2.5.6.8.10.12
[1., 1.2., 1.2.5., 1.2.5.6., ..., 1.2.5.6.8.10.12]
re.findall("^(\d+(?:\.|$))+", string)
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
带输出
mefy6pfw2#
当正则表达式解析器walks down the string的每个位置都被消耗。要提取具有相同起始位置的子字符串,需要 * lookbehind *,capture匹配朝向起始位置。捕获overlapping matches需要在lookaround内完成,以避免消耗捕获的部分。Python re不支持可变长度的lookbehind,但PyPI regex支持。
re
import regex as re res = re.findall(r"(?<=(.*\d(?:\.|$)))", s)
请参见www.example.com或a Regex101 demo上的Python演示tio.run(捕获将在 * 第一组 * 中)。在PyPI中甚至有一个overlapped=True * 选项 *,它允许 * 避免 * 在lookbehind中捕获。与(?r)一起,还可以实现另一个有趣的标记,用于执行 * 反向搜索 *。
overlapped=True
(?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(显示反转字符串的匹配)。
2条答案
按热度按时间pod7payv1#
在下面使用(BigQuery)
带输出
mefy6pfw2#
当正则表达式解析器walks down the string的每个位置都被消耗。要提取具有相同起始位置的子字符串,需要 * lookbehind *,capture匹配朝向起始位置。捕获overlapping matches需要在lookaround内完成,以避免消耗捕获的部分。Python
re
不支持可变长度的lookbehind,但PyPI regex支持。请参见www.example.com或a Regex101 demo上的Python演示tio.run(捕获将在 * 第一组 * 中)。
在PyPI中甚至有一个
overlapped=True
* 选项 *,它允许 * 避免 * 在lookbehind中捕获。与(?r)
一起,还可以实现另一个有趣的标记,用于执行 * 反向搜索 *。结果只需为reversed即可接收所需的订单:Python演示
使用标准的
re
,一个想法可以是reverse the string并在一个lookahead 中进行捕获。从反转的字符串中捕获所需的部分,最后在反转整个列表之前再次反转每个列表项。我不知道这是否值得,但似乎也很有效。www.example.com上的另一个Python演示tio.run或Regex101 demo(显示反转字符串的匹配)。