7

私はPythonにかなり慣れていないので、ファイルを解析しようとしています。ファイル内の特定の行のみに目的のデータが含まれており、ファイル内の有効な一致行から解析された内容の辞書を作成したいと考えています。

以下のコードは機能しますが、少し醜いので、おそらく理解するか、複数行の正規表現を使用して、どのように行うべきかを学ぼうとしています。Python 3.2 を使用しています。

file_data = open('x:\\path\\to\\file','r').readlines()
my_list = []
for line in file_data:
    # discard lines which don't match at all
    if re.search(pattern, line):
        # icky, repeating search!!
        one_tuple = re.search(pattern, line).group(3,2)
        my_list.append(one_tuple)
my_dict = dict(my_list)

より良い実装を提案できますか?

4

5 に答える 5

6

返信ありがとうございます。それらをまとめた後、私は

file_data = open('x:\\path\\to\\file','r').read()
my_list = re.findall(pattern, file_data, re.MULTILINE)
my_dict = {c:b for a,b,c in my_list}

しかし、助けがなければ今日そこにたどり着くことができなかったと思います。

于 2012-06-19T08:25:34.220 に答える
5

これは、コードに対する簡単な最適化です。

my_dict = dict()

with open(r'x:\path\to\file', 'r') as data:
    for line in data:
        match = re.search(pattern, line)
        if match:
            one_tuple = match.group(3, 2)
            my_dict[one_tuple[0]] = one_tuple[1]
于 2012-06-19T06:26:37.247 に答える
3

EAFPの精神で私が提案したい

with open(r'x:\path\to\file', 'r') as data:
    for line in data:
        try:
            m = re.search(pattern, line)
            my_dict[m.group(2)] = m.group(3)
        except AttributeError:
            pass

もう 1 つの方法は、リストを引き続き使用することですが、パターンを再設計して、含まれるグループが 2 つだけになるようにします(key, value)。次に、次のように簡単に実行できます。

  matches = [re.findall(pattern, line) for line in data]
  mydict = dict(x[0] for x in matches if x)
于 2012-06-19T07:48:34.057 に答える
2
matchRes = pattern.match(line)
if matchRes:
    my_dict = matchRes.groupdict()
于 2015-07-16T10:24:41.083 に答える
1

お勧めするかどうかはわかりませんが、代わりに内包表記を使用する方法を次に示します(簡単にするために、ファイルを文字列に置き換えました)

>>> import re
>>> data = """1foo bar
... 2bing baz
... 3spam eggs
... nomatch
... """
>>> pattern = r"(.)(\w+)\s(\w+)"
>>> {x[0]: x[1] for x in (m.group(3, 2) for m in (re.search(pattern, line) for line in data.splitlines()) if m)}
{'baz': 'bing', 'eggs': 'spam', 'bar': 'foo'}
于 2012-06-19T07:05:12.023 に答える