2012-03-25 43 views
1

我寫了以下正則表達式來匹配來自HTML文件的一組電子郵件。這些電子郵件可以採取各種形式,如RegEx在程序中的異常行爲

alice @ so.edu 
alice at sm.so.edu 
alice @ sm.com 
<a href="mailto:alice at bob dot com"> 

我一般使用RegexPal的編程語言實現之前測試我的正則表達式。我在發佈的最後一封電子郵件示例中觀察到一種奇怪的行爲。 RegexPal向我展示了我的正則表達式的匹配,但在Python程序中使用相同的正則表達式時,它不會給我帶來任何影響。可能是什麼原因?

mail_regex = (?:[a-zA-Z]+[\w+\.]+[a-zA-Z]+)\s*(?:@|\bat\b)\s*(?:(?:(?:(?:[a-zA-Z]+)\s* 
(?:\.|dot|dom)\s*(?:[a-zA-Z]+)\s*(?:\.|dot|dom)\s*)(?:edu|com))|(?:(?:[a-zA-Z]+\s*(?:\.|dot|dom)\s*(?:edu|com)))) 

RegEx有點複雜,以適應各種其他示例(在數據集中找到的電子郵件模式)。您還可以運行和檢查鍵盤背後的Python程序 - http://codepad.org/W2p6waBb

編輯

只給一個觀點相同的正則表達式的作品上 - http://pythonregex.com/

回答

2

它看起來像具體問題這裏是你需要使用原始字符串:

mail_re = r"(?:[a-zA-Z]+[\w+\.]+[a-zA-Z]+)\s*(?:@|\bat\b)\s*(?:(?:(?:(?:[a-zA-Z]+)\s*(?:\.|dot|dom)\s*(?:[a-zA-Z]+)\s*(?:\.|dot|dom)\s*)(?:edu|com))|(?:(?:[a-zA-Z]+\s*(?:\.|dot|dom)\s*(?:edu|com))))" 

否則,例如\b將是退格而不是單詞邊界。

此外,您正在使用JavaScript測試器。 Python有不同的語法和行爲。爲了避免出現意外,最好使用特定於Python的語法進行測試。

+0

如果我可能會問,那會是什麼?我可以確認該模式在Python中不匹配。除非我寫的RegEx語言不同,否則我覺得有點令人驚訝。 – Dexter 2012-03-25 02:13:48

+0

謝謝!不能相信我錯過了這一點。我的艱苦工作耗時10個小時。永遠不會忘記這一點。 :-( – Dexter 2012-03-25 02:19:46

+0

)你可以請你詳細說明你的意思是什麼「特定於Python」的語法?除了前綴r(原始字符串)我提到的正則表達式中的所有東西都很好,我猜。 – Dexter 2012-03-25 02:21:08