我有一个介于'<'
、'>'
之间的邮件列表 例如。'<mail1@test.com>, <mail2@test.com>'
.
我需要返回一个包含邮件的列表:['mail1@test.com', 'mail2@test.com']
试
re.search('<(.*)>', '<mail1@test.com> <mail2@test.com>').group(0)
但我得到相同的字符串
使用re.findall()
将匹配项作为列表返回,您需要通过附加问号来使您的.*
不贪婪。请参阅此处有关*?
的部分。
re.findall('<(.*?)>', '<mail1@test.com> <mail2@test.com>')
# ['mail1@test.com', 'mail2@test.com']
请注意,如果您的输入字符串始终像您给出的示例一样格式化,则可以通过以下方式实现相同的目标:
test_string = '<mail1@test.com> <mail2@test.com>'
[s[1:-1] for s in test_string.split()]
# ['mail1@test.com', 'mail2@test.com']
这只是在电子邮件之间的空格上拆分,然后只获取每封电子邮件中第一个和最后一个之间的字符,扔掉'<'
和'>'
。
正则表达式很棒,但对于更简单的操作来说,它通常比它的价值更麻烦。
你快到了!
为此,应该修改两件事。
不要使用re.search()
,而是使用re.findall()
>>> re.findall('<(.*)>', '<mail1@test.com> <mail2@test.com>')
['mail1@test.com> <mail2@test.com']
re.search()
只会找到一个匹配项,而re.findall()
将搜索所有匹配项。
您的正则表达式是"贪婪的",请在正则表达式中添加问号以解决此问题。
>>> re.findall('<(.*?)>', '<mail1@test.com> <mail2@test.com>')
['mail1@test.com', 'mail2@test.com']
贪婪的表情会尝试吞下尽可能多的文本。在这种情况下,这不是您想要的。
与其为正则表达式而烦恼,不如创建每个地址的列表,然后删除尖括号:
[x.replace('<', '').replace('>', '') for x in '<mail1@test.com>, <mail2@test.com>'.split(', ')]