regex 如何确定哪一个匹配属于哪一个模式?

r8xiu3jd  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(112)

给出了需要从下面的文本中提取的多个模式。

import re

s = 'This text2 11contains 4 numbers and 6 words.'

字符串
例如,假设我需要分别提取单词和数字,我可以:

>>> re.findall(r'[a-zA-Z]+', s)
['This', 'text', 'contains', 'numbers', 'and', 'words']


和/或

>>> re.findall(r'\d+', s)
['2', '11', '4', '6']


但是,如果我想在一个表达式中合并这两个表达式,我会这样做:

>>> re.findall(r'[a-zA-z]+|\d+', s)
['This', 'text', '2', '11', 'contains', '4', 'numbers', 'and', '6', 'words']


但我需要分辨出哪个属于哪个模式。在这种情况下,我可以简单地检查isnumeric(),并相应地对每个模式进行分组,但随着模式变得越来越复杂,没有办法分辨,除非单独提取每个模式,如果需要单独提取大量文档和模式,这最终将变得效率低下。获取匹配类型的方法是什么?对于上面的示例,它将类似于:

['This', 'text', '2', '11', 'contains', '4', 'numbers', 'and', '6', 'words']
['word', 'word', 'number', ...]


或者每个组[0, 0, 1, 1, ...]简单列举。

ki1q1bka

ki1q1bka1#

使用命名组匹配:

s = 'This text2 11contains 4 numbers and 6 words.'
matches_it =  re.finditer(r'(?P<word>[a-zA-Z]+)|(?P<number>\d+)', s)
res = [(m.group(), m.lastgroup) for m in matches_it]

个字符

hgtggwj0

hgtggwj02#

您可以使用组,如命名组。例如,对于re.finditer()re.Match.groupdict()

regex = r'(?P<word>[a-zA-Z]+)|(?P<number>\d+)'
matches = re.finditer(regex, s)
for m in matches:
    for k, v in m.groupdict().items():
        if v is not None:
            print(k, v)

个字符

jk9hmnmh

jk9hmnmh3#

使用组,类似于以下内容:

>>> [(w, "word") if w else (n, "number") for w, n in re.findall(r'([a-zA-z]+)|(\d+)', s)]
[('This', 'word'),
 ('text', 'word'),
 ('2', 'number'),
 ('11', 'number'),
 ('contains', 'word'),
 ('4', 'number'),
 ('numbers', 'word'),
 ('and', 'word'),
 ('6', 'number'),
 ('words', 'word')]

字符串

相关问题