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

2024-03-29 14:49:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

对于2个字符串:

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

我怎样才能将regex仅与第一个匹配


Tags: 字符串regexaaxxbvzziybmdhrponwuy
3条回答

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

^(?!.*(?=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的右上面板上进行了解释,如果您希望探索/简化/修改它,在this link中,您可以观察它如何与一些示例输入匹配(如果您愿意)

将我对问题的原始评论作为回答

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

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

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

要使用一些代码(you can test it here)来支持它,请执行以下操作:

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的部分,它被称为列表理解。既然这不是问题的一部分,我就不在这里解释了

如果只想匹配字符A-Z,可以使用

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

解释

  • AA逐字匹配
  • (?:
    • [A-WYZ]匹配除X以外的A-Z
    • |
    • X(?!X)匹配X并断言直接右边的不是X
  • )*关闭非捕获组并重复0+次
  • ZZ逐字匹配

Regex demo

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

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

Regex demo

另一种选择是使用令牌:

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

Regex demo

相关问题 更多 >