這個問題在這里已經有了答案: 為什么在這個 RegEx 中順序很重要? (3 個答案) 21 小時前關閉。
''' The repeating_letter_a function checks if the text passed
includes the letter "a" (lowercase or uppercase) at least twice.
For example, repeating_letter_a("banana") is True, while
repeating_letter_a("pineapple") is False. '''
import re
def repeating_letter_a(text):
# result = re.search(r"A |a .*a ", text) <-- this works fine
# result = re.search(r"a |A .*a ", text) <-- this does not
return result != None
# These test cases include the desired outcomes:
print(repeating_letter_a("banana")) # True
print(repeating_letter_a("pineapple")) # False
print(repeating_letter_a("Animal Kingdom")) # True
print(repeating_letter_a("A is for apple")) # True
我能夠生成有效的代碼,但我很困惑為什么“A |a ”與“a |A ”的順序會有所不同。如果我在 Regex101.com 上測驗代碼,任何一個版本都可以正常作業,這讓我認為它與 Python(或 re 模塊)的 regex 實作有關。任何想法,見解,建議?
uj5u.com熱心網友回復:
@Kaz
關于 Python 正則運算式的有序選擇語意當然是正確的,但這不是這里的問題。這里的問題只是運算子優先級;串聯的結合不如交替緊密。所以沒有A |a 子模式,因為A |a .*a 意味著(A )|(a .*a ). 同樣, a |A .*a 意味著(a )|(A .*a )。這些顯然匹配不同的字串。第一個不匹配pineapple,因為它正在尋找一個A或兩個a;第二個匹配pineapple,因為它將匹配一個或一個同時包含和a的字串。您的測驗用例都沒有一個;這兩個測驗還包括. 所以你的測驗也需要一些作業。AaAAa
我想你是故意(A |a ).*a 的。如果你這樣做了,你可能想考慮使用[Aa] .*a , 或者即使[Aa] .*[Aa] 它有輕微的語意差異。它仍然不正確。
我不明白強制重復運算子的用法 。你是說不Aarhus應該通過,因為兩個As是連續的?如果是這樣,你會稍微接近一點[Aa] .*a ,因為它會匹配Aa。A |a 將匹配AAor aa,但給定輸入Aarhus它只會匹配A. 剩下的就是arhus要與模式的其余部分相匹配,.*a 。這將成功,因為.*將匹配空字串。
無論如何, 不??需要重復。如果你想匹配Aarhus,那么你可以使用[Aa].*[Aa], 它匹配包含兩個as 的單詞。如果你想堅持 s 有兩個簇a,所以它Aarhus不匹配但匹配aardvark,那么你可以使用,如果兩個s之間[aA][^aA].*[aA]至少有一個非- 則匹配。aa
uj5u.com熱心網友回復:
基于回溯搜索的 Regex 實作往往有一個有趣|的運算子,其順序很重要,因為它們通過按從左到右的順序嘗試替代項來作業。編譯為等效的 NFA/DFA 的正則運算式沒有這個怪癖。
它不會對確定基本問題產生影響:給定的輸入字串是否屬于正則運算式表示的字串集?
但是,它對部分匹配有所不同:回答諸如此正則運算式是否匹配此字串的前綴以及多長時間之類的問題。給定A|B,如果A和都B獨立匹配前綴S,但長度不同,則組合的正則運算式A|B必須匹配兩者中較長的那個;但是從左到右嘗試替代方案的回溯實作將停止在A。它也可以嘗試B跟蹤哪個是較長的匹配項,但這會使它變慢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/535566.html
上一篇:regex_token_iterator<>有時會丟失匹配的子字串
下一篇:如何忽略空組?
