求助:如何编写正则表达式匹配满足多条件的目标字符串
解决正则表达式筛选符合条件字符串的问题
我来帮你搞定这个正则表达式的问题!首先咱们先明确你需要满足的三个核心筛选条件:
- 必须包含以下任意一种:
@、at、(at) - 必须包含以下任意一种:
dot、.de - 字符串必须以
de结尾
你的原始正则r"(de$)(@)"逻辑有问题:它要求字符串同时以de结尾并且紧跟@,这完全不符合需求,而且也没覆盖at、dot这些需要匹配的关键词,所以才会失效。
正确的正则表达式
我们可以用正则的**正向预查(lookahead)**来把三个条件组合起来,确保所有要求都被满足:
^(?=.*(@|at|\(at\)))(?=.*(dot|\.de)).*de$
正则各部分拆解解释
咱们把这个正则拆开来理解,就清楚为什么这么写了:
^:匹配字符串的起始位置,确保从开头开始检查(?=.*(@|at|\(at\))):正向预查规则,确保字符串里存在@、at或者(at)(括号是正则特殊字符,所以用\(和\)转义)(?=.*(dot|\.de)):另一项正向预查,确保字符串里存在dot或者.de(点是正则特殊字符,用\.转义).*:匹配任意数量的任意字符,用来容纳三个条件之间的任意内容de$:匹配字符串的结尾位置,确保最后是de
修改后的Python代码
把这个正则替换到你的代码里,就能正确筛选目标字符串了:
import re mail_li = ['lokesh.g@uni-passau.de', 'lokesh dot gat uni-passau dot de', 'lokesg.g(at)uni-passau.de', 'lokesh.g(at) uni-passau.de', 'onefullword@gw.uni-passau.de', 'lokesh(dot) g(at) uni-passau (dot) de', '@laskdjak'] # 替换为正确的正则表达式 regex = r"^(?=.*(@|at|\(at\)))(?=.*(dot|\.de)).*de$" for i in mail_li: # 用fullmatch确保整个字符串符合规则,比findall更精准 if re.fullmatch(regex, i): print(i)
运行结果
执行这段代码后,会输出所有符合条件的字符串:
lokesh.g@uni-passau.de lokesh dot gat uni-passau dot de lokesg.g(at)uni-passau.de lokesh.g(at) uni-passau.de onefullword@gw.uni-passau.de lokesh(dot) g(at) uni-passau (dot) de
最后一个@laskdjak因为不以de结尾,所以不会被匹配到,完全符合你的筛选要求。
内容的提问来源于stack exchange,提问作者hsekol
相关产品推荐
相关产品推荐

