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