【问题标题】:python, regular expressions, named groups and "logical or" operatorpython、正则表达式、命名组和“逻辑或”运算符
【发布时间】:2010-10-28 13:29:34
【问题描述】:

在python正则表达式中,命名组和未命名组都用'('和')'定义。这会导致一种奇怪的行为。正则表达式

"(?P<a>1)=(?P<b>2)"

与文本“1=2”一起使用会发现命名组“a”的值为“1”,命名组“b”的值为“2”。但是,如果我想使用“逻辑或”运算符并连接多个规则,则以下正则表达式:

"((?P<a>1)=(?P<b>2))|(?P<c>3)"

与相同的文本“1=2”一起使用会找到一个值为“1=2”的未命名组。我知道正则表达式引擎将包含组“a”和“b”的“(”和“)”视为未命名组并报告它已找到。但我不想报告未命名的组,我只想使用“|”为了将多个正则表达式“粘合”在一起。无需创建任何寄生的未命名组。这是在python中这样做的一种方式吗?

【问题讨论】:

    标签: python regex


    【解决方案1】:

    使用(?:) 摆脱未命名组:

    r"(?:(?P<a>1)=(?P<b>2))|(?P<c>3)"
    

    来自re的文档:

    (?:...) 的非分组版本 正则括号。匹配任何东西 正则表达式在里面 括号,但子字符串匹配 按组检索后无法检索 执行匹配或稍后引用 在模式中。

    顺便说一句,交替运算符| 的优先级很低,以便在像您这样的情况下不需要括号。您可以在正则表达式中删除额外的括号,它会继续按预期工作:

    r"(?P<a>1)=(?P<b>2)|(?P<c>3)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      相关资源
      最近更新 更多