获取< >之间的字符串列表



我有一个介于'<''>'之间的邮件列表 例如。'<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(', ')]

最新更新