【问题标题】:How to match regex included in one another如何匹配包含在彼此中的正则表达式
【发布时间】:2021-12-10 11:17:28
【问题描述】:

我正在用 python 编码,我的问题如下:

我正在尝试为以特定方式描述的产品匹配正则表达式。假设产品 1 是 ABC + 字母数字字符或符号(例如 ABC123-xyz、ABC123def),产品 2 是 AB + 字母数字字符或符号(例如 AB123xY-z、AB123deF)。我需要检索全名,但也需要根。根区分大小写,否则我可以使用 IgnoreCase = True。

我第一次尝试匹配的是全名:

r"\bAB[^a-zA-Z\s][^,.\s]+"

对于根:

\r"\bAB"

根将匹配产品 2 的所有示例,但也匹配产品 1 的示例(因为 AB 包含在 ABC 中)在所有情况下输出 AB。

我找到的解决方案全文如下:

r"\b(?:AB(?!C))[^a-zA-Z\s][^,.\s]+"

对于根:

r"\b(?:AB(?!C))"

这使我能够独特地匹配这两种产品。

?:的用途是匹配一个非捕获组(https://stackoverflow.com/a/11530881/14682360),没有它,它只会输出“AB”作为一个组。

(?!C) 的使用是表示负前瞻,确保“C”不在任何“AB”匹配组之后。为了我个人的使用,我指定了所有可以使产品选择相互交织的字符(即 AB 和 ABC、DE 和 DEF 等)

[^a-zA-Z\s][^,.\s]+ 的使用在我的例子中是匹配一个数字或一个符号,并在逗号、句号或空格的转义字符处停止。

话虽如此,我相信还有更好的方法。

【问题讨论】:

  • 这里的问题是什么?您不需要非捕获组,因为目前它本身没有任何用途。同样在模式\b(?:AB(?!C))[^a-zA-Z\s][^,.\s]+" 中,可以省略否定前瞻,因为以下否定字符类[^a-zA-Z\s] 实际上匹配除A-Z 之外的任何字符,它也覆盖C 字符。
  • 您说得对,在检索项目全名时存在冗余,谢谢。问题在于检索缩写。在查询 AB 时,我还匹配 ABC 项目,我的目标是一次检索所有项目的首字母。公平地说,没有真正的问题,因为我找到了一个工作不干净的解决方案。只是想我会为处于类似情况的任何人分享我最初的问题和解决方案。

标签: python regex


【解决方案1】:

如果我正确理解了您的问题,那么如果在初始“AB”之后立即出现“C”,则要求不匹配。与使用负前瞻相比,以下内容会更简单且更短:

\bAB[^C,.\s][^,.\s]+

您可以在这里看到它的实际效果:

https://regex101.com/r/3VPwLK/1

如果您知道自己永远不会遇到“AB”后跟逗号、句号或空格,您可以将其缩短为:

\bAB[^C][^,.\s]+

这与全文匹配,但您可以使用捕获组仅获取根或仅获取根之后的部分。但除非我遗漏了什么,否则产品 2 的根不总是 AB 吗?

仅捕获根:\b(AB)[^C,.\s][^,.\s]+

仅在 root 后捕获部分:\bAB([^C,.\s][^,.\s]+)

以下内容将匹配两种产品类型,根在第一个捕获组中:

\b(ABC?)[^,.\s]+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多