2012-03-14 54 views
0

我試圖用Python實現Pig Latin。 我想匹配其通過輔音或「曲」開頭的字符串(不管的情況下),所以找到的第一個字母,所以起初我是這樣做的:python findall,帶有「|」的正則表達式和分組

first_letters = re.findall(r"^[^aeiou]+|^[qQ][uU]", "qualification") 

它沒有工作(只查找「q」),所以我想,我不得不添加q中的第一組:

first_letters = re.findall(r"^[^aeiouq]+|^[qQ][uU]", "qualification") 

使作品(它找到「曲」,這不僅「q」)!

但玩弄我發現自己這個:

first_letters = re.findall(r"{^[^aeiou]+}|{^[qQ][uU]}", "qualification") 

,沒有工作,因爲它是一樣的,第一個表達式我想我的想法。 但最後這也工作:

first_letters = re.findall(r"{^[^aeiou]+}|(^[qQ][uU])", "qualification") 

我不知道爲什麼。有人可以告訴我爲什麼?

回答

2

反轉的規則的順序:

>>> re.findall(r"^[qQ][uU]|^[^aeiou]+", "qualification") 
['qu'] 
>>> re.findall(r"^[qQ][uU]|^[^aeiou]+", "boogie") 
['b'] 
>>> re.findall(r"^[qQ][uU]|^[^aeiou]+", "blogie") 
['bl'] 

在你的第一種情況下,^[^aeiou]+匹配q第一個正則表達式。在第二種情況下,由於您已將q添加到第一部分,因此正則表達式引擎檢查第二個表達式並匹配qu

在你的其他情況下,我認爲第一個表達式不會做你認爲它的作用(即大括號內的^字符),所以它是第二個表達式,它再次匹配。

你的第三和第四模式的第一部分,{^[^aeiou]+}試圖匹配一個大括號{接着是start-of-line後面跟着一個或多個非元音字符,然後是文字右大括號}。由於您沒有啓用re.MULTILINE,因此我認爲您的模式在技術上是有效的,但無法匹配任何輸入。

+0

是的,我想通了,我可以扭轉規則,但我不明白爲什麼用大括號的工作,^內部做什麼?對不起,我找不到在Google上查找的正確詞語。 – 2012-03-14 15:57:31

+0

更新了答案。 – beerbajay 2012-03-14 16:02:23

+0

非常感謝! – 2012-03-14 16:18:12

2

您應該在[^aeuio]之前放qu,因爲否則「q」會被類捕獲並且無法匹配。除此之外,[Qq][Uu]是不需要的,只需要提供不區分大小寫的標誌:

first_letters = re.findall(r"^(qu|[^aeiou]+)", "qualification", re.I) 

鑑於你可能會到字符串匹配其餘爲好,這將是更實際:

start, rest = re.findall(r"^(qu|[^aeiou]+)?(.+)", word, re.I)[0] 
0

|從左到右運行,並在第一次成功時停止。所以,這就是爲什麼你找到第一個表達式只有q,而第二個表達式只有qu

不知道你最終的正則表達式是什麼,特別是關於{}表達式。不過,|之後的部分將符合資格條件。也許這就是你所看到的。

您可能會發現re.I(忽略大小寫)標誌有用。