簡體   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