[英]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
)和JANE
或MARY
子字符串。 現在,固定的正則表達式匹配:
(?s)
-DOTALL內聯修飾符 TOM
文字字符序列 \\s*
-0+空格 (.+?)
-組1(捕獲):直到后繼子模式的第一個出現為止,盡可能少的 1+個字符。 \\s*
-0+空格 (?:JANE|MARY)
JANE
或MARY
子字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.