regex 构建编译的交替列表的正确方法

t5fffqht  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(71)

我有一系列的正则表达式模式,它们被分组到类别中。我试图静态地将它们编译成交替,但我不希望丢失任何特殊的含义。
例如,我通过名称识别Raspberry Pi GPIO引脚。有GPIO引脚,0-27(巧合的是与BCP命名相同的数字),电压参考引脚和命名功能引脚。根据特定的物理引脚福尔斯哪个类别,可以做出假设;例如,电压基准引脚从不具有上拉状态,也不具有GPIO/BCM编号。
于是:

_cats = {
    'data': (
        r'gpio\.?([0-9]|[1-3][0-9]|40)',
    ),
    'vref': (
        r'v3_3',
        r'v5'
        r'gnd',
    ),
    'named': (
        r'SDA\.?([01])',
        r'CE\.?0'
        r'CE\.?1',
    ),
}

字符串
我想做的第一件事是将所有的模式组合成一个单独的编译的交替,这样我就可以检查输入是否实际上 * 匹配 * 我的任何键。对于第一个dict中的单个字符串,我可以简单地用途:

crx = rx.compile(('\A' + _cats['data'][0] + '\Z'), rx.IGNORECASE)


对于所有这些,我可以这样做:

crx = re.compile('|'.join([('\A' + rx + '\Z') for rx in _cats['vref']]), re.IGNORECASE)


但这让我有点困惑每个正则表达式项都应该是^$\A\Z有界的,但是将它们连接成交替,然后编译它们给了我一些问题。
我正在寻找类似Emacs的regexp-opt函数的东西。
我已经尝试了所描述主题的变体,并得到了语法错误,不匹配任何内容的模式,以及匹配太多的模式。

xwbd5t1u

xwbd5t1u1#

我相信你可以用regex named groups实现所有的要求。语法为(?P<NAME>EXPRESSION)

import re

#expressions
DATA  = r'(?P<data>gpio\.?([0-9]|[1-3][0-9]|40))'
VREF  = r'(?P<vref>v3_3|v5|gnd)'
NAMED = r'(?P<named>SDA\.?([01])|CE\.?[01])'

#compiled expression
search = re.compile(fr'{DATA}|{VREF}|{NAMED}').search

#find
if m:=search(YourData):
    print(m.group('data'))
    print(m.group('vref'))
    print(m.group('named'))

字符串

相关问题