我正在撰寫一個使用正則運算式處理電子郵件的函式。我認為我寫的模式是正確的,但是,我找不到為什么例子2 'what-do-you-know [email protected]'未能被檢測到,而例子1卻成功了?
def parse_email(s)。
try:
pattern = re.compile(r'([a-zA-Z])([w.-_ ] )@([w.-] )([a-zA-Z])' )
matches = pattern.finditer(s)
for match in matches:
print(match.group(0)
return (match.group(1) match.group(2), match.group(3) match.group(4)
except AttributeError:
#print('這里')
raise ValueError
print(parse_email('[email protected]')
print(parse_email('hat-do-you-know [email protected]'))
結果:
[email protected]
('JKRowling', 'Huge-Books.org')
[email protected]
('much', 'gmail.com')
uj5u.com熱心網友回復:
從re檔案:
字符范圍可以通過給出兩個字符并以'-'分隔來表示,例如,[a-z]將匹配任何小寫ASCII字母,[0-5][0-9]將匹配從00到59的所有兩位數,而[0-9A-Fa-f]將匹配任何十六進制數字。如果"-"被轉義(例如:[a-z]),或者如果它被置于第一個或最后一個字符(例如:[-a]或[a-]),它將匹配一個字面的"-"。
看起來你想匹配一個字面的-,所以把它作為范圍的第一個字符,例如:[-xxx]:
pattern = re.compile(r'([a-zA-Z])([-w._ ] )@([-w. ] ) ([a-zA-Z]) ' )
測驗:
>>> import re
>>> pat = r"([a-zA-Z])([-w._ ] )@([-w.] )([a-zA-Z])"
>>> old_pattern = re.compile(r'([a-zA-Z])([w.-_ ] )@([w.-] )([a-zA-Z]) ' )
>>> new_pattern = re.compile(r'([a-zA-Z])([-w._ ] )@([-w. ] ) ([a-zA-Z])')
>>> old_pattern.search('hat-do-you-know [email protected]')
<re.Match object; span=(21, 35), match='[email protected]'/span>>
>>> new_pattern.search('what-do-you-know [email protected]'/span>)
<re.Match object; span=(0, 35), match='hat-do-you-know [email protected]'>
uj5u.com熱心網友回復:
歡迎來到正則運算式的奇妙世界,在這里,最微小的變化都會導致完全意想不到的結果。
r'([a-zA-Z])([w.-_ ] )@([w.-] )([a-zA-Z])'
是一個正確的選擇,因為你希望專案是有自己的詞。但要小心,因為這不會包括一個字串的開頭或結尾。
([a-zA-Z])如果你的第一個捕獲組。你可以用更簡單的([A-z]) 替換。
([w.-_ ] )是你的第二個捕獲組。它將捕獲。
w任何單詞字符(多余的)
.不一定會捕捉到句號字符,而是捕捉到 "任何 "字符 。
-將不捕獲破折號字符,相反,將捕獲一系列的字符 。
_確實將捕獲下劃線字符 - 但在這種情況下,它被參考為一個范圍的結束 。
不會捕獲加號字符,而是從一個組或范圍中獲得 "1或更多 "的字符。
... 我將在這里停止,因為其余的部分或多或少都是相似的......
你將會從組或范圍中獲取 "1個以上 "的字符。
你要把你的重碼替換成以下內容:
r'([A-z0-9- ] @[A-z- ] .[A-z]{3})'
- 只有一個捕獲組,因為我們想要整個電子郵件地址。
- 電子郵件地址(這里)允許包含。
- 在at符號之前。
[A-z0-9- ] 所有的字母數字字符以及'-'和' '字符(如用轉義字符-和 表示
- 在at符號之后,是一個域名
[A-z- ],包含α字符和轉義字符 。
- 后面是一個域名擴展名
.[A-z]{3} 例如:.org
接下來,你可以將你的代碼重構為:
import re
pattern = re.compile(r'([A-z0-9- ] @[A-z- ] . [A-z]{3})'/span>)
match = pattern.search(s)
if match:
email = match.group()
else:
email = None。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/323611.html
標籤:
上一篇:有什么方法可以在VBA中重復excel的if陳述句,這取決于你在什么單元格上。
下一篇:如何選擇不為空的最后一個值?
