【问题标题】:Combine two regular expressions with a logical "and" operator将两个正则表达式与逻辑“and”运算符组合
【发布时间】:2021-02-25 12:16:54
【问题描述】:

我正在尝试构建一个组合正则表达式,但我不知道如何组合两个子表达式

  • 我有一个这样的输入字符串:4711_001.doc
  • 要匹配以下内容:4711.doc
  • 我可以用这个表达式匹配 4711:[^\_\.]*
  • 我可以将 .prt 与此表达式匹配:\.[^.]+

是否有某种逻辑 AND 来组合这两个表达式并匹配 4711.doc?表达式会是什么样子?

【问题讨论】:

  • ^([^_.]+).*(\.[^.]+)$ 替换为$1$2,参见regex101.com/r/56A0YS/1
  • 不知道为什么每个人都认为问题是关于 Python 的 :) 你的编码环境是什么?
  • @WiktorStribiżew 在阅读您的评论之前,我没有意识到问题与 Python 无关。我希望 Stefan J. 了解 Python。

标签: regex


【解决方案1】:

您可以使用组在一个正则表达式中执行此操作。查看此代码以供参考:

import re
s = "4711_001.doc"
match = re.search(r"(.+?)_\d+(\..+)", s)
print(match.group(1) + match.group(2))

输出:

4711.doc

【讨论】:

    【解决方案2】:

    另一种可能性是匹配您不想要的部分:

    _\d+
    

    并将其替换为"":

    import re
    s = "4711_001.doc"
    match = re.sub(r"_\d+", "", s)
    print(match)
    

    在线查看demo

    【讨论】:

      【解决方案3】:

      对于这个示例字符串 4711_001.doc,使用 [^_.]*\.[^.]+ 是一个相当广泛的匹配,因为它可以匹配除字符类中列出的字符之外的任何字符。

      也许您可以使模式更具体一些,匹配开头的数字和作为扩展名的单词字符。

      在替换中使用捕获组 1 和 2,通常表示为 $1$2\1\2

      (\d+)_\d+(\.\w+)
      

      Regex demo

      没有标记语言,但如果支持例如 \K 清除匹配缓冲区,这也可能是一个选项(包括您尝试过的部分)

      在替换中使用空字符串。

      [^_.]*\K_[^._]+(?=\.[^.]+$)
      

      部分

      • [^_.]*\K匹配下划线前的部分,然后忘记到目前为止匹配的内容
      • _[^._]+ 匹配下划线,后跟除 ._ 之外的 1+ 个字符
      • (?=\.[^.]+$) 肯定的前瞻断言,以确保右侧是 . 后跟除 . 之外的任何字符,直到字符串末尾。

      Regex demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        相关资源
        最近更新 更多