[英]Colliding regex for emails (Python)
我試圖在同一個 Pythonic 正則表達式中同時獲取用戶名(例如 abc123@)和電子郵件(例如 (abc123@company.com))。
這是一個示例語句:
abc123@ is a researcher at abc123@company.com doing cool work.
使用的正則表達式:
對於用戶名:
re.match("^([A-Za-z])+([@]){1}$")
對於 email:
re.match("^([A-Za-z0-9-_])+(@company.com){1}$")
大多數情況下,會發生什么情況是用戶名被抓取,但不是 email 地址(試圖將它們作為兩個單獨的實體抓取) - 有什么想法嗎?
實際上,您的正則表達式中有很多組和重復計數以及開始/結束邊界,這些並不是真正必要的。 這兩個足以在輸入字符串中找到每個。
對於用戶: [A-Za-z0-9]+@
對於 email: [A-Za-z0-9-_]+@company.com
但是,如果您想要分組,則可以使用以下版本:
對於用戶: ([A-Za-z0-9])+(@)
對於 email: ([A-Za-z0-9-_]+(@company.com)
免責聲明:我僅在 Java 上對此進行了測試,因為我對 Python 不太熟悉。
在您的模式中,您使用錨^
和$
來斷言字符串的開始和結束。
刪除錨點,將其留給用戶名模式([A-Za-z])+([@]){1}
在這里,您可以省略{1}
和捕獲組。 請注意,在示例中, abc123@
包含您不匹配的數字。
盡管如此,使用[A-Za-z0-9]+@
將在 email abc123@company.com
中獲得部分匹配,您可以使用右側空白邊界。
用戶名模式可能看起來像
\b[A-Za-z0-9]+@(?!\S)
\b
一個詞的邊界[A-Za-z0-9]+
匹配列出的 1+ 次出現(包括數字)@
字面上匹配(?!\S)
負前瞻,斷言右邊不是非空白字符對於 email 地址,使用像[A-Za-z0-9-_]
這樣的字符 class 非常嚴格。
如果你想要一個廣泛的匹配,你可以使用:
[^\s@]+@[^\s@]+\.[a-z]{2,}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.