【问题标题】:Python split by regular expression?Python按正则表达式拆分?
【发布时间】:2012-04-20 08:08:15
【问题描述】:

好的,在 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中可能吗?

“通过正则表达式拆分”是指如果程序遇到字符串中的模式,它将提取该部分并将其放入列表中。

【问题讨论】:

    标签: python regex email split


    【解决方案1】:

    我不是正则表达式专家,但我想说您正在寻找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 的帮助,现在正则表达式应该会更好。

    【讨论】:

    • 至少不要忘记转义唯一需要转义的.
    • @Qtax:谢谢,我已经做出改变了。正如我所说,正则表达式不是我最好的,如果您仍然发现有问题,请不要犹豫编辑或让我知道 :)
    【解决方案2】:

    我在您的正则表达式中看到的问题是您使用了匹配字符串开头的^ 和匹配字符串结尾的$。如果您删除它,然后使用您的示例测试用例运行它,它将起作用

    >>> 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']
    >>> 
    

    【讨论】:

    • 您的正则表达式末尾缺少+
    【解决方案3】:

    使用re.searchre.findall。 您还需要正确转义您的表达式(. 需要在字符类之外转义,而不是在内部)并删除/替换锚点^$(例如使用\b),例如:

    r"\b[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+\b"
    

    【讨论】:

    • "\b" 开头和结尾对 mailto:foo@foo.com! 无效。
    • @marue,你试过了吗?它会工作得很好。 : 不是单词字符。
    猜你喜欢
    • 2021-10-07
    • 2015-10-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多