我很少使用| *之前。但是今天,當我將它們兩個都用在一起時,我發現一些結果令人困惑。我使用的表達式爲(在python)如下:替代匹配的行爲「|」與。*在正則表達式
>>> s = "abcdefg"
>>> re.findall(r"((a.*?c)|(.*g))",s)
[('abc',''),('','defg')]
第一caputure的結果是所有的權利,但第二捕捉出乎我的意料,因爲我預計第二擷取將是「ABCDEFG」 (整個字符串)。
然後我扭轉兩種選擇:
>>> re.findall(r"(.*?g)|(a.*?c)",s)
[('abcdefg', '')]
看來,正則表達式引擎只讀取字符串一次 - 當在第一替代讀取整個字符串,正則表達式引擎將停止,不再檢查第二個選擇。但是,在第一種情況下,在處理第一種替代方案之後,正則表達式引擎僅從「a」讀取「c」,並且字符串中仍有「d」到「g」,與「。*?」匹配。克「在第二個選擇。我說得對嗎?更重要的是,對於有替代表達式的表達式,正則表達式引擎會首先檢查第一個替代方案,如果它匹配字符串,它將永遠不會檢查第二個替代方案。這是對的嗎?
此外,如果我想要像第一種情況一樣獲取「abc」和「abcdefg」或「abc」和「bcde」(兩個結果重疊),我應該使用什麼表達式?
非常感謝!
你不能從正則表達式中的相同位置開始兩個匹配。 're.findall'將抓取字符串中所有不重疊的匹配項,並且由於第一個匹配項從頭開始,以'c'結尾,下一個匹配項只能在'defg'內的'c'之後找到。 –
@cᴏʟᴅsᴘᴇᴇᴅ你知道,欺騙的原因是不正確的(這不是[捕獲組與findall?]的愚蠢?](https://stackoverflow.com/questions/6018340/capturing-group-with-findall)問題)。 –
@WiktorStribiżew道歉,閱讀前幾句話並作出反應。 –