微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法在不同的替代分支中统一正则表达式捕获组?

如何解决有没有办法在不同的替代分支中统一正则表达式捕获组?

假设我有这样的代码

import re

rx = re.compile(r'(?:(\w{2}) (\d{2})|(\w{4}) (\d{4}))')
def get_id(s):
    g = rx.match(s).groups()
    return (
        g[0] if g[0] is not None else g[2],int(g[1] if g[1] is not None else g[3]),)

print(get_id('AA 12'))      # ('AA',12)
print(get_id('BBBB 1234'))  # ('BBBB',1234)

这符合我的要求,但它要求我检查每个捕获组以检查哪个捕获组实际捕获了子字符串。如果替代方案的数量很多,这可能会变得笨拙,所以我宁愿避免这种情况。

我尝试使用命名捕获,但 (?:(P<s>\w{2}) (?P<id>\d{2})|(?P<s>\w{4}) (?P<id>\d{4})) 只是引发错误

Unify capture groups for multiple cases in regex 的答案中的技巧不起作用,因为 (\w{2}(?= \d{2})|\w{4}(?= \d{4})) (\d{2}|\d{4}) 会捕获错误数量的数字,并且出于我不想进入的原因,我无法手动优化备选方案的顺序。

有没有更地道的写法?

解决方法

好像有!来自 re 文档:

        (?(id/name)yes|no) Matches yes pattern if the group with id/name matched,the (optional) no pattern otherwise.

示例如下:

rx = re.compile(r'(?P<prefix>(?P<prefix_two>)\w{2}(?= \d{2})|(?P<prefix_four>)\w{4}(?= \d{4})) (?P<digits>(?(prefix_two))\d{2}|(?(prefix_four))\d{4})')
def get_id(s):
    m = rx.match(s)
    if not m:
        return (None,None,)
    return m.group('prefix','digits')

print(get_id('AA 12'))      # ('AA',12)
print(get_id('BB 1234'))    # ('BB',12)
print(get_id('BBBB 12'))    # (None,None)
print(get_id('BBBB 1234'))  # ('BBBB',1234)

是否值得麻烦,我会留给读者。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?