0

我有两个清单。一个列表 ,ref包含正则表达式项,允许越来越大的灵活性,而另一个列表 ,input包含要与正则表达式匹配的输入列表。到目前为止,我能够创建match下面的字典。下面是我正在尝试创建的字典,match_upd. match由输入中的键和ref值中的对应匹配项组成。值项由 中每个匹配的元组项的第二项组成ref。此外,其中的每个值都match包含实现匹配的命名捕获组。所需的输出,match_upd, 将包含相同的值,但这些值中的每一个还包括匹配的捕获组中成功匹配的命名捕获组的计数,以及匹配捕获组中匹配的那些计数。下面的例子非常抽象,如果这让人感到困惑,我深表歉意。基本上,我试图统计比赛中可选捕获组的数量,以及参与比赛的这些组的数量。我正在使用 Python 的新正则表达式模块。

input = [(' PREDIR NAME SUFTYP B1 ', 'CCCC, 11111'), (' NAME SUFTYP SUFDIR A1 ', 'CCCC, 11111')]

ref = [('(?P<iter1> PREDIR PRETYP NAME SUFTYP SUFDIR )|(?P<iter2> (?P<iter2pd>PREDIR )?(?P<iter2pt>PRETYP )?NAME(?P<iter2st> SUFTYP)?(?P<iter2sd> SUFDIR)? .*? )|(?P<iter3>.*? NAME .*? )', ['PREDIR,PRETYP,NAME,SUFTYP,SUFDIR,', 'CCCC, 11111']), ('(?P<iter1> NAME )|(?P<iter2> NAME )|(?P<iter3>.*? NAME .*? )', [',,NAME,,,', 'CCCC, 11111']), ('(?P<iter1> PREDIR NAME SUFTYP )|(?P<iter2> (?P<iter2pd>PREDIR )?NAME(?P<iter2st> SUFTYP)? .*? |(?P<iter3> .*? NAME .*?)', ['PREDIR,,NAME,SUFTYP,,', 'CCCC, 11111'])]

match {' NAME SUFTYP SUFDIR A1 , CCCC, 11111': (([',,NAME,,,', 'CCCC, 11111'], 'iter3'), (['PREDIR,,NAME,SUFTYP,,', 'CCCC, 11111'], 'iter2'), (['PREDIR,PRETYP,NAME,SUFTYP,SUFDIR,', 'CCCC, 11111'], 'iter2')), ' PREDIR NAME SUFTYP B1 , CCCC, 11111': ((['PREDIR,,NAME,SUFTYP,,', 'CCCC, 11111'], 'iter2'),['PREDIR,PRETYP,NAME,SUFTYP,SUFDIR,', 'CCCC, 11111'], 'iter2'), ([',,NAME,,,', 'CCCC, 11111'], 'iter3'))}

match_upd {' NAME SUFTYP SUFDIR A1 , CCCC, 11111': (([',,NAME,,,', 'CCCC, 11111'], 'iter3',0,0), (['PREDIR,,NAME,SUFTYP,,', 'CCCC, 11111'], 'iter2',1,2), (['PREDIR,PRETYP,NAME,SUFTYP,SUFDIR,', 'CCCC, 11111'], 'iter2',2,4)), ' PREDIR NAME SUFTYP B1 , CCCC, 11111': ((['PREDIR,,NAME,SUFTYP,,', 'CCCC, 11111'], 'iter2',2,2),['PREDIR,PRETYP,NAME,SUFTYP,SUFDIR,', 'CCCC, 11111'], 'iter2',2,4), ([',,NAME,,,', 'CCCC, 11111'], 'iter3',0,0))}

我可以match使用以下代码生成:

def match(i,o,addr,ref,group):
    m = regex.fullmatch(i[0],o[0])
    if m:
        addr.append(str(o).strip('('')').replace("'",""))
        ref.append(i[1])
        m = m.groupdict()
        for k,v in m.items():
            if v is not None:
                group.append(k)

addr = []
ref = []
group = []

for i in ref:
    for t in input:
        if t[1] == i[1][2]:
            match(i,t,addr,ref,group)

unmatched = []
for i in input:
    unmatched.append(str(i).strip('('')').replace("'",""))

match_iter123 = zip(addr,zip(ref,group))
unmatched123 = list((set(unmatched)) - (set(addr)))

matchdict123 = {}
[matchdict123.setdefault(k,[]).append(v) for k,v in match_iter123]

matchdict = defaultdict(tuple)

for i in match_iter123:
    matchdict[i[0]] += i[1:]

match = {k:v for k, v in matchdict.items()}

我尝试附加所需输出的尝试match_upd并没有取得成果:

def match(i,o,addr,ref,group,matchattributes,totalattributes):
    m = regex.fullmatch(i[0],o[0])
    if m:
        addr.append(str(o).strip('('')').replace("'",""))
        ref.append(i[1])
        m = m.groupdict()
        for k,v in m.items():
            if v is not None and re.search(r'pd|pt|sd|st',k) is None:
                group.append(k)
        for k,v in m.items():
            if v is not None and re.search(r'pd|pt|sd|st',k) is not None:
                matchattributes.append(len(k))
        for k,v in m.items():
            if re.search(r'pd|pt|sd|st',k) is not None:
                totalattributes.append(len(k))

我是编程新手,如果这个答案很简单,请原谅我。我基本上需要对最后两个for语句进行计数。感谢您的帮助和耐心。

4

1 回答 1

0

我想到了。回想起来,这是一个非常简单的解决方案。matchattributes我只需要确定和totalattributes变量的总数。该+=函数是解决方案,将总数附加到一个空列表中。

def match(i,o,addr,ref,group,matchattributes,totalattributes):
    matchcounter = 0
    totalcounter = 0
    m = regex.fullmatch(i[0],o[0])
    if m:
        addr.append(str(o).strip('('')').replace("'",""))
        ref.append(i[1])
    m = m.groupdict()
    for k,v in m.items():
            if v is not None and re.search(r'pd|pt|sd|st',k) is None:
                group.append(k)
    for k,v in m.items():
        if v is not None and re.search(r'3(pd|pt|sd|st)',k):
            matchcounter += 1
    matchattributes.append(matchcounter)
    for k,v in m.items():
        if re.search(r'3(pd|pt|sd|st)',k):
            totalcounter += 1
    totalattributes.append(totalcounter)
于 2013-02-28T13:58:04.633 回答