正则表达式 - 提取单词里面< >括号

时间:2017-12-22 14:56:49

标签: python regex

我正在尝试从

这样的字符串中提取电子邮件地址

John Smith <jsmith@email.com>

我只需要&lt;中的电子邮件地址。 &GT;括号中。

这是我到目前为止所尝试的内容,但我对正则表达式并不是很好,它似乎没有用,有人可以帮忙吗?

import re
sender = str(message.sender)
p = re.search(r"\<(\w+)\>", sender)
logging.info(p.group(1))

3 个答案:

答案 0 :(得分:1)

你可以试试这个:

import re
s = "John Smith <jsmith@email.com>"   
email = re.findall('<(.*?)>', s)[0]

输出:

'jsmith@email.com'

或者,更具体的电子邮件解决方案:

email = re.findall('(?<=\<)\w+@[a-zA-Z]+\.[a-z]+(?=\>)', s)[0]

输出:

'jsmith@email.com'

答案 1 :(得分:0)

目前你的正则表达式是:"\<(\w+)\>" 您实际上不需要转义<>,因此它变为:"<(\w+)>" \w匹配字母,数字和欠打'_'。在电子邮件地址中还有其他字符。

您有两种选择:只需使用<>等正则表达式接受"<(.*)>"内的任何内容,或者实际解析电子邮件地址。

一个简单的正则表达式是"<\S+@\S+>"(非空白字符后跟@后跟非空白字符。

限制使用更常用的字符,我们可以写:"<[a-zA-Z0-9+_.-]+@[a-zA-Z0-9.-]+>这仍然允许某些非法的电子邮件地址,因为我保持相当简单。

答案 2 :(得分:0)

使用否定字符集:

import re
s = "John Smith <jsmith@email.com>"   
email = re.findall('<([^>])>', s)[0]

匹配任何不是>字符的东西,所以角括号中的所有内容都是。