好的,在python中,我正在从字符串中提取电子邮件,如下所示:
split = re.split(" ", string)
emails = []
pattern = re.compile("^[a-zA-Z0-9_\.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-\.]+$");
for bit in split:
result = pattern.match(bit)
if(result != None):
emails.append(bit)
只要电子邮件之间有空格,这就有效。但情况可能并非总是如此。例如:
Hello, foo@foo.com
将返回:
foo@foo.com
但是,请使用以下字符串:
I know my best friend mailto:foo@foo.com!
这将返回null
。所以问题是:我怎样才能使正则表达式成为分裂的分隔符?我想要
foo@foo.com
在所有情况下,不管它旁边的惩罚。这在python中是否可行?
通过“正则表达式拆分”,我的意思是如果程序遇到字符串中的模式,它将提取该部分并将其放入列表中。
答案 0 :(得分:2)
我不是正则表达式专家,但我会说你正在寻找re.findall
:
>>> email_reg = re.compile(r'[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+')
>>> email_reg.findall('I know my best friend mailto:foo@foo.com!')
['foo@foo.com']
请注意findall
可以处理多个电子邮件地址:
>>> email_reg.findall('Text text foo@foo.com, text text, baz@baz.com!')
['foo@foo.com', 'baz@baz.com']
编辑:使用Qtax帮助正则表达式现在应该更好。
答案 1 :(得分:1)
使用re.search
或re.findall
。
您还需要正确地转义表达式(.
需要在字符类之外转义,而不是在内部)并删除/替换锚点^
和$
(例如{{1} }}),例如:
\b
答案 2 :(得分:1)
我在你的正则表达式中看到的问题是你使用匹配字符串开头的^
和匹配字符串结尾的$
。如果你删除它然后用你的样本测试用例运行它将会起作用
>>> re.findall("[A-Za-z0-9\._-]+@[A-Za-z0-9-]+.[A-Za-z0-9-\.]+","I know my best friend mailto:foo@foo.com!")
['foo@foo.com']
>>> re.findall("[A-Za-z0-9\._-]+@[A-Za-z0-9-]+.[A-Za-z0-9-\.]+","Hello, foo@foo.com")
['foo@foo.com']
>>>