【问题标题】:python regex match A but not B in any orderpython 正则表达式以任何顺序匹配 A 但不匹配 B
【发布时间】:2020-12-20 04:47:35
【问题描述】:

这个问题有一个答案here,但我似乎无法将它用于我的用例。

我想匹配一个包含单词“reset”但不包含密码的字符串。例如假设我有以下两个:

queries = ["reset my password", "reset my account please.", "password reset"]
for q in queries:
    print(is_reset(q))

应该输出False, True, False,其中is_reset 将包含正则表达式。

我尝试的正则表达式是:

matches = re.search("(?=reset)(?!.*password)", text)
if matches:
    print("Matched")
else:
    print("No match")

上一个查询似乎有问题。另外我在盲目复制正则表达式,有人能解释一下上面的正则表达式/答案是什么意思吗?

【问题讨论】:

  • 你可以用'reset' in q and 'password' not in q
  • @Reza 哦。我现在感觉超级傻。我想我在那里把事情复杂化了。好吧,至少我学到了一些关于正则表达式的知识。

标签: python regex


【解决方案1】:

您当前的模式(?=reset)(?!.*password) 的主要问题是,虽然它确实有正确的前瞻,断言reset 存在并且password 不存在,但模式本身是零宽度,因此永远不会匹配任何非零宽度的内容。我会使用这种模式:

^(?!.*\bpassword\b).*\breset\b.*$

这匹配任何出现reset 的输入,并且它在开头有一个否定断言以排除password 的存在。

示例脚本:

queries = ["reset my password", "reset my account please.", "password reset"]
for q in queries:
    matches = re.search(r'^(?!.*\bpassword\b).*\breset\b.*$', q)
    if matches:
        print("Matched:  " + q)
    else:
       print("No match: " + q)

打印出来:

No match: reset my password
Matched:  reset my account please.
No match: password reset

【讨论】:

  • 我认为他不希望password reset 匹配。
  • @leoOrion 我已经修正了我的答案,感谢您的反馈。
  • 我建议\breset\b,出于同样的原因,您将password 括在单词边界中(例如,避免匹配preset),并且不要相信您需要$
  • 同意。我打算编辑,但觉得我以前的版本已经明白了。
【解决方案2】:

如果您想使用正则表达式执行此操作,您必须在 passsword 上进行否定查找,在 reset 上进行肯定查找 -

^(?=.*reset)(?!.*password).*

这应该可行。

(?=.*reset) -> 当有reset 时匹配。 (?!.*password).* -> 有password时不匹配

主要问题是您一直期望重置之前没有任何内容。在reset 之前添加.* 以表明它之前也可以有字符。同样password 后面也可以有字符。因此.*password 之后

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 2021-06-15
    • 2015-02-20
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多