2012-05-26 68 views
2

我试图从正则表达式中使用正则表达式从一串文本中获取电子邮件地址。从字符串中提取电子邮件,而不是从字符串整行

我怎样才能让我的简单代码只提取电子邮件地址而不是整行?

demo_text = """hsds hjdsjd ksdkj 

Reason: 550 [email protected] No such user 

sdhjsdjh 
""" 
# the following code extracts the whole line "Reason: 550 [email protected] No such user" 
# how do I just extract "[email protected]"? 
email = re.search("Reason: 550 (.+)... No such user", demo_text).group(0) 

回答

8

.group(0)返回整个字符串。你想.group(1)

email = re.search("Reason: 550 (.*?)... No such user", demo_text).group(1) 
2

取而代之的是组1。

....group(1) 
0

一个更普遍的正则表达式的解决办法是:

r"[\w.][email protected][\w.]+" 
+1

我想尝试这一个还有:HTTP:// WWW。 ex-parrot.com/pdw/Mail-RFC822-Address.html。那个只用于验证,所以我会用它来处理使用这个正则表达式提取的电子邮件。 – Blender

+1

@Blender:我喜欢那个。它简短,可读,简洁:) –

+2

@Joel:请停止传播** BROKEN **电子邮件地址的正则表达式。 –

-1

只需使用:

email_id = re.search(r'([\w.])[email protected]([\w.])+', demo_text) 
email_id.group(1) # the username part 
email_id.group(2) # the host part 
+0

该正则表达式看起来不正确。我认为你的意思是使用反斜杠而不是正斜杠 –

+0

@Joel yep我打算使用'\'(ans-replace'/'和'\') – Vivek

+0

@Vivek:请不要指出你的正则表达式会在最简单的情况下失败(你省略了许多有效字符);你在两个*例子中都有错误的地方出现了'+'(第一个应该在捕获组内,第二个在'@'旁边;即使你把它们正确放置了,你的正则表达式也会捕获最后的'.'s – Ashe