簡體   English   中英

如何使用python正則表達式匹配替代項

[英]How to match alternatives with python regex

給定字符串1:

'''TOM喜歡游泳MARY喜歡去游樂場JANE喜歡購物'''

我只想捕獲兩個名稱之間的文本。 湯姆和瑪麗或湯姆和簡。 如果Mary出現在Jane之前,我想捕捉Tom和Mary之間的文本。 但是,如果簡首先出現,我想捕捉湯姆和簡之間的文字。

我寫了以下代碼:

text = re.compile(r'''(
            TOM\s*
            ([\w\W]+)\s*
            JANE|MARY
            )''', re.VERBOSE)

text_out = text.search(string).group(1)

但是,即使瑪麗首先出現,此代碼也會給我提供Tom和Jane之間的文本。 我知道這是因為管道函數從左到右讀取,因此將首先匹配Jane。 有沒有一種方法可以對此進行編碼,以使其取決於誰首先出現在文本中?

例如,在string2中:“'''TOM喜歡去游泳JANE喜歡去購物MARY喜歡去游樂場'''

我想要捕獲Tom和Jane之間的string2文本。

您需要修復替換,它必須包含在一個非捕獲組(?:JANE|MARY) ,並使用帶有[\\w\\W]的惰性量詞(我將用.*替換並使用re.DOTALL使點也與換行符匹配的修飾符):

(?s)TOM\s*(.+?)\s*(?:JANE|MARY)

正則表達式演示

如果不使用(?:...|...) ,則您的正則表達式匹配Tom ,那么任何1個以上的字符都應盡可能多(即,正則表達式捕獲了整個字符串,然后回溯以匹配后續出現的最后一個字符)子模式( JANE )和JANEMARY子字符串。 現在,固定的正則表達式匹配:

  • (?s) -DOTALL內聯修飾符
  • TOM文字字符序列
  • \\s* -0+空格
  • (.+?) -組1(捕獲):直到后繼子模式的第一個出現為止,盡可能少的 1+個字符。
  • \\s* -0+空格
  • (?:JANE|MARY) JANEMARY子字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM