繁体   English   中英

Python正则表达式匹配两个字符串,如果另一个字符串不在中间

[英]Python Regex Matching Two Strings If another String not Between

我只想在*不包含XX搜索AA*ZZ

对于 2 个字符串:

"IY**AA**BMDHRPONWUY**ZZ**"
"BV**AA**BDMYB**XX**W**ZZ**CKU"

如何仅将正则表达式与第一个匹配?

如果您只想匹配字符 AZ,您可以使用

AA(?:[A-WYZ]|X(?!X))*ZZ

解释

  • AA匹配字面意思
  • (?:
    • [A-WYZ]匹配除 X 之外的 AZ
    • | 或者
    • X(?!X)匹配 X 并断言右边的不是 X
  • )*关闭非捕获组并重复 0+ 次
  • ZZ字面上匹配

正则表达式演示

如果还有其他字符,另一种选择是使用否定字符类[^\\sX]匹配除 X 或空白字符以外的任何字符:

AA(?:[^\sX]|X(?!X))*ZZ

正则表达式演示

另一种选择是使用温和的贪婪令牌:

AA(?:(?!\btest\b).)*BB

正则表达式演示

发布我对问题的原始评论作为答案

除了已经发布的“单一正则表达式”解决方案之外,请考虑以下解决方案:

  1. 首先,查找AAZZ之间任何文本的所有匹配项,例如使用此正则表达式: AA(.+)ZZ 将所有匹配项存储在列表中。
  2. 循环(或使用过滤器函数,如果可用)前面步骤中的匹配列表并删除不包含XX的那些。 您甚至不需要为此使用 Regex,因为包括 Python 在内的大多数语言都有专用的字符串方法。

你得到的回报是一个干净的解决方案,没有任何复杂的正则表达式。 它易于阅读,易于维护,如果要添加任何新条件,它们可以应用于最终结果。

用一些代码来支持它(你可以在这里测试):

import re


test_str = """
IYAABMDHRPONWUYZZ
BVAABDMYBXXWZZCKU
"""

# First step: find all strings between AA and ZZ
match_results = re.findall("AA(.+)ZZ", test_str, re.I)

# Second step: filter out the ones that contain XX
final_results = [match for match in match_results if not ("XX" in match)]

print(final_results)

至于分配给final_results的部分,它被称为列表理解。 由于这不是问题的一部分,我不会在这里解释。

我的猜测是,您可能(但不确定)想要设计一个类似于以下内容的表达式:

^(?!.*(?=AA.*XX.*ZZ).*).*AA.*ZZ.*$

测试

import re

regex = r"^(?!.*(?=AA.*XX.*ZZ).*).*AA.*ZZ.*$"

test_str = """
IYAABMDHRPONWUYZZ
BVAABDMYBXXWZZCKU
AABMDHRPONWUYXxXxXxZZ
"""

print(re.findall(regex, test_str, re.M))

输出

['IYAABMDHRPONWUYZZ', 'AABMDHRPONWUYXxXxXxZZ']

该表达式在regex101.com 的右上角面板中进行了解释,如果您希望探索/简化/修改它,并且在此链接中,您可以观看它如何与某些示例输入匹配,如果您愿意的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM