获取<>

时间:2019-08-27 17:30:09

标签: python regex

我有一个'<''>'之间的邮件列表 例如。 '<mail1@test.com>, <mail2@test.com>'

我需要返回包含以下邮件的列表:['mail1@test.com', 'mail2@test.com']

尝试

re.search('<(.*)>', '<mail1@test.com> <mail2@test.com>').group(0)

但是我得到了相同的字符串

3 个答案:

答案 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(', ')]