0

2 つのリストがあります。一方のリスト にはref、ますます柔軟性を高めることができる正規表現の項目が含まれ、もう一方のリスト にはinput、正規表現と照合される入力リストが含まれます。これまでのところ、match以下の辞書を作成できます。この下に、作成しようとしている辞書がありますmatch_updmatch入力からのキーと、対応する for 値からの一致で構成さrefれます。値項目は、一致したすべてのタプル項目の 2 番目の項目で構成され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基本的に、最後の 2 つのステートメントのカウントが必要です。ご協力いただきありがとうございます。

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 に答える