You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何编写正则表达式匹配满足多条件的目标字符串

解决正则表达式筛选符合条件字符串的问题

我来帮你搞定这个正则表达式的问题!首先咱们先明确你需要满足的三个核心筛选条件:

  • 必须包含以下任意一种:@、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:33:11