拆分所有事件并保留分隔符

时间:2019-05-24 08:37:15

标签: python regex

我已经读过thisthisthis以及很多其他书籍。他们没有回答我的问题。

我想过滤一个字符串,其中可能包含以<@>开头的电子邮件字符串(例如电子邮件,但在“ @”之前没有文本)。我已经测试了很多,但是最接近的最简单的方法之一是:

import re
re.split(r'(@)', "test @aa test2 @bb @cc t-es @dd-@ee, test@again")
Out[40]: 
['test ', '@', 'aa test2 ', '@', 'bb ', '@', 'cc t-es ', '@', 'dd-', '@', 'ee, test', '@', 'again']

我正在寻找适合我的正则表达式:

['test ', '@aa', 'test2 ', '@bb ', '@cc', 't-es ', '@dd-', '@ee', 'test@again']

2 个答案:

答案 0 :(得分:1)

当您可以使用“ yo regex,请给我所有匹配项”时,为什么要尝试拆分:

test = "test @aa test2 @bb @cc t-es @dd-@ee, test@again"


import re

print(
    re.findall("[^\s@]*?@?[^@]* |[^@]*@[^\s@]*", test)
)
# ['test ', '@aa test2 ', '@bb ', '@cc t-es ', '@dd-', '@ee, ', 'test@again']

我尝试过,但是我不能使正则表达式变小,但至少它能起作用,并且谁仍然希望正则表达式变小


根据OP的新要求(或已更正的要求)

[^\s@]*?@?[^\s@]* |[^@]*@[^\s@]* 

答案 1 :(得分:0)

基于不同的电子邮件解析和简单的“ @[:alphanum:]+”解析的我自己的解决方案是:

USERNAME_OR_EMAIL_REGEX = re.compile(
    r"@[a-zA-Z0-9-]+"  # simple username
    r"|"
    r"[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+"  # email 
    r"@"  # following: domain name:
    r"[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?"
    r"(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)")