1

次のような長い文字列があります。

s = 'label("id1","A") label("id1","B") label("id2", "C") label("id2","A") label("id2","D") label("id3","A")'

正規表現を使用して、ID に基づいてラベルのリストを作成したいと思います。

より明確にするためsに、例の文字列から、次のような結果のリストになりたいと思います。

[("id1", ["A","B"]),
 ("id2", ["C","A","D"]),
 ("id3", ["A"])]

正規表現を使用して、ID と要素を取得できました。

import re
regex = re.compile(r'label\((\S*),(\S*)\)')
results = re.findall(regex,s)

このコードでは、results次のようになります。

[('"id1"', '"A"'),
 ('"id1"', '"B"'),
 ('"id2"', '"A"'),
 ('"id2"', '"D"'),
 ('"id3"', '"A"')]

正規表現から既に正しくグループ化されたデータを取得する簡単な方法はありますか?

4

2 に答える 2

1

結果をループして、オブジェクトfindall()に収集できます。ただし、引用符が含まれないように正規表現を調整し、空白の許容範囲を追加してください。collections.defaultdict

from collections import defaultdict
import re

regex = re.compile(r'label\("([^"]*)",\s*"([^"]*)"\)')
results = defaultdict(list)

for id_, tag in regex.findall(s):
    results[id_].append(tag)

print results.items()

一意の値だけが必要な場合は、 とlistで置き換えることができます。setappend()add()

デモ:

>>> from collections import defaultdict
>>> import re
>>> s = 'label("id1","A") label("id1","B") label("id2", "C") label("id2","A") label("id2","D") label("id3","A")'
>>> regex = re.compile(r'label\("([^"]*)",\s*"([^"]*)"\)')
>>> results = defaultdict(list)
>>> for id_, tag in regex.findall(s):
...     results[id_].append(tag)
... 
>>> results.items()
[('id2', ['C', 'A', 'D']), ('id3', ['A']), ('id1', ['A', 'B'])]

必要に応じて、この結果も並べ替えることができます。

于 2013-08-08T16:48:13.217 に答える
0

後処理は許容できる結果ですか?

もしそうなら、

import re
# edited your regex to get rid of the extra quotes, and to allow for the possible space that occurs in label("id2", "C")
regex = re.compile(r'label\(\"(\S*)\",\ ?\"(\S*)\"\)')
results = re.findall(regex,s)
resultDict = {}
for id, val in results:
    if id in resultDict:
        resultDict[id].append(val)
    else:
        resultDict[id] = [val]

# if you really want a list of tuples rather than a dictionary:
resultList = resultDict.items()
于 2013-08-08T16:56:41.123 に答える