我有一个'<'
,'>'
之间的邮件列表
例如。 '<mail1@test.com>, <mail2@test.com>'
。
我需要返回包含以下邮件的列表:['mail1@test.com', 'mail2@test.com']
尝试
re.search('<(.*)>', '<mail1@test.com> <mail2@test.com>').group(0)
但是我得到了相同的字符串
答案 0 :(得分:1)
使用re.findall()
将匹配项作为列表返回,并且您需要通过添加问号使.*
不贪婪。请参阅*?
here上的部分。
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']
这只是在电子邮件之间的空白处分开,然后仅在每封电子邮件的第一和最后一个字符之间输入字符,从而抛出'<'
和'>'
。
正则表达式很棒,但是它比通常的简单操作要麻烦得多。
答案 1 :(得分:0)
您快到了!
要使其正常工作,需要修改两件事。
使用re.search()
代替使用re.findall()
>>> re.findall('<(.*)>', '<mail1@test.com> <mail2@test.com>')
['mail1@test.com> <mail2@test.com']
re.search()
只会找到一个匹配项,而re.findall()
将搜索所有匹配项。
您的正则表达式为'greedy',请在正则表达式中添加问号以解决该问题。
>>> re.findall('<(.*?)>', '<mail1@test.com> <mail2@test.com>')
['mail1@test.com', 'mail2@test.com']
贪婪的表情会尝试吞下尽可能多的文字。在这种情况下,这不是您想要的。
答案 2 :(得分:0)
您可以创建每个地址的列表,然后删除尖括号,而不用担心正则表达式:
[x.replace('<', '').replace('>', '') for x in '<mail1@test.com>, <mail2@test.com>'.split(', ')]