用Python正则表达式匹配字母数字单词、提及或电子邮件

2024-04-26 07:24:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经读过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']

我正在寻找合适的regexp,它可以提供:

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

Tags: 字符串test文本importrees电子邮件this
2条回答

当你可以去“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@]* 

我自己基于不同电子邮件解析+简单“@[: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])?)")

相关问题 更多 >