正则表达式匹配字符串后返回匹配到的组。

3
假设我们有以下正则表达式:
[ABC]{1,3}.{0,2}[DEFG].{2,3}V

我们可以使用Python的re模块来测试是否与以下字符串匹配:
AXDXXV

它确实匹配。那么,使用Python,我们如何检索由字符串的每个部分匹配的正则表达式的每个部分?

例如,以下输出列表将起作用:

[ '[ABC]{1,3}', '.{0,2}', '[DEFG]', '.{2,3}', 'V' ]

1
将每个部分用捕获组包装 - http://ideone.com/Wzd1G7 - Wiktor Stribiżew
1
我认为不支持这种程度的内省,你需要改变(添加一些捕获组到)你的正则表达式。 - Igonato
1个回答

4

您可以使用命名捕获组,在匹配到内容后,您可以通过groupDict()方法获取到这些命名所对应的值。我建议您将此模式动态构建为一个OrderedDict

可以参考Python 2.7演示

import re, collections

# Define the pattern parts with named capturing groups
parts = [('p1', r'(?P<p1>[ABC]{1,3})'),
    ('p2', r'(?P<p2>.{0,2})'),
    ('p3', r'(?P<p3>[DEFG])'),
    ('p4', r'(?P<p4>.{2,3})'),
    ('p5', r'(?P<v>V)')]
# Create and init the OrderedDict
pod = collections.OrderedDict(parts)
# Build the pattern from values (in Python 3, use list(pod.items()) )
reg = "".join([v for k,v in pod.items()])
test_str = "AXDXXV"
# Find a match
m = re.search(reg, test_str)
if m:
    # If a match is found, get the groupdict()
    m_dict = m.groupdict()
    print(m_dict)
    print("{} => {}".format(m.group("p1"), pod["p1"]))

正则表达式将类似于(?P<p1>[ABC]{1,3})(?P<p2>.{0,2})(?P<p3>[DEFG])(?P<p4>.{2,3})(?P<v>V),一旦找到匹配项,您将得到像这样的内容 {'p2': 'X', 'p3': 'D', 'p1': 'A', 'p4': 'XX', 'v': 'V'}。然后,您可以始终使用"{} => {}".format(m.group("p1"), pod["p1"])检查一个值的底层模式(例如,A => (?P<p1>[ABC]{1,3}))。

谢谢Wiktor Stribiżew。这个方法可行,但前提是能够预先定义好正则表达式的部分模式。如果在匹配字符串之后自动识别这些部分是否匹配成功,会不会更好呢?例如,在这里第一个'A'将由正则表达式的[ABC]{1,3}部分识别,那么我们怎样才能得到以[ABC]{1,3}作为第一个元素的输出列表呢? - NPalopoli
那之后的唯一方法就是解析该模式。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接