簡體   English   中英

電子郵件的沖突正則表達式(Python)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM