gpt4 book ai didi

Python 正则表达式匹配上一组中的匹配项(多选 1)

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:59 25 4
gpt4 key购买 nike

我有正则表达式 (?:AA|BB)(.*)(?:AA|BB) 捕获分隔符 AA 之间的所有内容>BB.

我遇到的问题是这也会匹配 AA...BB。这是我不想要的。我怎样才能使正则表达式只匹配 AA...AABB...BB

最佳答案

如果您需要匹配的字符串以相同前导和尾随分隔符开头和结尾,您只需捕获前导分隔符并使用反向引用 在模式本身内部:

(AA|BB)(.*)\1
^ ^ ^^

参见 regex demo

在 Python 中,如果您只想获取所需的组,则必须使用 re.finditer,而不是返回元组列表的 re.findall(因此将包含 AABB)。要匹配从 AA 到第一个下一个 AA 的子字符串,请使用惰性量词 *?:(AA|BB)(。 *?)\1

Python demo :

import re
p = re.compile(r'(AA|BB)(.*)\1')
test_str = "AA text AA"
print([x.group(2).strip() for x in p.finditer(test_str)])
# => ['text']

如果您需要匹配具有不匹配的前导和尾随定界符 的字符串,您将不得不使用alternation。 :

AA(.*)AA|BB(.*)BB

或者 - 惰性量词版本以匹配最接近的尾随 AABB:

AA(.*?)ZZ|BB(.*?)YY

请注意,这将在结果中输出空元素,因为只会匹配一组。在大多数 Python 构建中,如果您打算在 re.sub 中使用此模式,则应谨慎使用(直到 Python 3.5,不匹配组未使用空字符串初始化 (=None)并可能抛出异常。

这是一个 extraction sample code使用 re.finditer:

import re
p = re.compile(r'(AA)(.*?)(ZZ)|(BB)(.*?)(YY)')
test_str = "AA Text 1 here ZZ and BB Text2 there YY"
print("Contents:")
print([x.group(2).strip() for x in p.finditer(test_str) if x.group(2)])
print([x.group(5).strip() for x in p.finditer(test_str) if x.group(5)])
print("Delimiters:")
print([(x.group(1), x.group(3)) for x in p.finditer(test_str) if x.group(1) and x.group(3)])
print([(x.group(4), x.group(6)) for x in p.finditer(test_str) if x.group(4) and x.group(6)])

结果:

Contents:
['Text 1 here']
['Text2 there']
Delimiters:
[('AA', 'ZZ')]
[('BB', 'YY')]

在现实生活中,对于非常长和复杂的文本,这些正则表达式可以是 unrolled使匹配线性且高效,但这是另一回事。

最后但同样重要的是,如果您需要将一个分隔符的最短子字符串匹配到另一个不包含这些分隔符的字符串,请使用 tempered greedy token :

AA((?:(?!AA|ZZ).)*)ZZ|BB((?:(?!BB|YY).)*)YY
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^

参见 regex demo查看与 AA(.*?)ZZ|BB(.*?)YY 的区别.

关于Python 正则表达式匹配上一组中的匹配项(多选 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com