2017-09-11 42 views
2

問題:正則表達式無法識別具有特殊字符的電子郵件?

我寫了一個正則表達式來識別text.But它是不承認有特殊字符的電子郵件一樣-。所以我修改了正則表達式來匹配它不匹配特殊characters.Now電子郵件的電子郵件地址正常email.s

regex = r"\"?([-a-zA-Z0-9.`?{}][email protected]\w+\.\w+)\"?" 

TEXT = 「爲了解決解析是更多資料」

DETECT = "[email protected]" 
NOT_DETECT = "[email protected]" 

修改:

regex = r"\"?([-a-zA-Z0-9.`?{}][email protected]\w+\-+\w+\.\w+)\"?" 

TEXT =「應對解析是更多資料」

DETECT = "[email protected]" 
NOT_DETECT = "[email protected]" 

是否有任何正則表達式組合這兩個這兩個正則表達式同時匹配的電子郵件。 像

[email protected] 
[email protected] 
+1

見['\「([ - α-ZA-Z0-9 \'{}。? ] + @ \ w +( - ?\ w +)* \ \ w +)\「'](https://regex101.com/r/vWgIIK/1)。?。你實際上可以進一步加強它。 –

+0

@WiktorStribiżew它不能在Python中工作。 –

+0

它[在Python中完美工作](https://regex101.com/r/vWgIIK/2)。看,[一個Python演示](https://ideone.com/CVvLud)。 –

回答

1

爲了使您的工作模式,您需要添加,將匹配的- 0+序列,然後1個或多個字字符,(?:-\w+)*部分:

"?([-a-zA-Z0-9.`?{}][email protected]\w+(?:-\w+)*\.\w+)"? 
         ^^^^^^^^^ 

regex demo

詳細

  • "? - 任選"
  • ([-a-zA-Z0-9.`?{}][email protected]\w+(?:-\w+)*.\w+) - 第1組(什麼re.findall將輸出):
    • [-a-zA-Z0-9.`?{}]+ - 在字符類中定義的1個或多個字符(- ,ASCII字母,數字,.,`,?{}(注意,您可能要限制這部分開始與任何字母,然後也匹配_,如[^\W\d_][-\w.`?{}]*
    • @ - 一個@
    • \w+ - 1個或多個字母/數字/ _
    • (?:-\w+)* - 的- 0+序列,然後1個或更多個字母/數字/ _
    • \. - 點
    • \w+ - 1或多個字母/數碼網絡TS/_
  • "? - 任選"

Python demo

import re 
rx = r"\"?([-a-zA-Z0-9.`?{}][email protected]\w+(?:-\w+)*\.\w+)\"?" 
s = """ "[email protected]" and [email protected]""" 
print(re.findall(rx, s)) 
# => ['[email protected]', '[email protected]'] 
1

你可以做一個更鬆散的正則表達式。 這裏是一個命題,即不符合兩個地址:

[a-zA-Z\d][email protected]+\..{,3} 

讓我們來分析一下:

[a-zA-Z\d][email protected]+\.[a-zA-Z\d]{,3} 

[a-zA-Z\d]      Match any alphanumerical character... 
      +      ... at least once 
      @      Match the arobase 
      .+     Match any character at least once... 
       \.     ... before a dot 
       [a-zA-Z\d]{,3} Then check at least three alphanumerical characters 

與Python檢查:

>>> import re  
>>> s = "[email protected]"  
>>> re.match("[a-zA-Z\d][email protected]+\.[a-zA-Z\d]{,3}", s) 
<_sre.SRE_Match object; span=(0, 20), match='[email protected]'> 

>>> s = "[email protected]m" 
>>> re.match("[a-zA-Z\d][email protected]+\.[a-zA-Z\d]{,3}", s) 
<_sre.SRE_Match object; span=(0, 19), match='[email protected]'> 
0

使用*而不是+

r"\"?([-a-zA-Z0-9.`?{}][email protected]\w+\-*\w+\.\w+)\"?" 

連字符後的星號匹配零個或多個匹配項。你有一個至少匹配一個連字符的加號。順便說一句,而不是\-*,你可以使用[-]*。在方括號之間可以插入除-之外的任何其他特殊字符。