正则表达式中的返回组与字符串匹配

时间:2017-05-11 22:44:44

标签: python regex

假设我们有以下正则表达式:

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

如果匹配以下字符串,我们可以使用Python的re模块进行测试:

AXDXXV

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

例如,以下输出列表可以使用:

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

1 个答案:

答案 0 :(得分:4)

您可以使用命名捕获组,在获得匹配后,您将能够获取映射到这些名称的值(使用groupDict())。我还建议动态地构建这样的模式作为 OrderedDict

查看Python 2.7 demo

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}))。