0

基本的に、「@」記号以外に何もない行がいくつかある巨大なテキスト ファイルがあります。

単一の「@」記号にすぎない最初の行より前のすべての行を印刷したい。

私はpythonは初めてですが、正規表現にはかなり精通していますが、これを理解できません。ここに私がこれまでに持っているものがあります:

original = open('oldfile.txt')
for each_line in original:  
    pattern = re.compile("(^.*)(^@\s)", re.M)
    m = re.match(pattern, each_line).group(1)
    print(m)

original.close

私は 1 時間半の間、Python のオンライン ドキュメントやその他のスタック オーバーフローの記事を読んでいますが、どういうわけかまだこれを取得できていません。

そのコードの結果は次のとおりです。

AttributeError: 'NoneType' オブジェクトには属性 'group' がありません

4

2 に答える 2

3

ここでは正規表現は必要ありません。実際には非常に単純です。

with open('file.txt') as file:
    for line in file:
        line = line.rstrip("\n")
        if line == "@":
            break
        print(line)

ファイルを開き (このwithステートメントを使用すると、読みやすくなり、例外が発生した場合でもファイルが確実に閉じられます)、ファイル内の行をループ処理します。行がただの場合はループから抜け出し"@"、そうでない場合は行を出力して続行します。

コメントで指摘されているように、行から改行文字を削除する必要があります (またはチェックする必要があります"@\n"(それを行った場合はprint(line, end="")、3.x またはprint line,2.xでもprint()余分な改行を追加するのをやめる必要があります)。

Martijn Piters が指摘しているように、takewhile()関数 fromを使用してこれを行う別の方法がありitertoolsます。これは、条件が満たされるまでイテラブルからアイテムを取得します。これは、まさにここで必要なものです。

import itertools

with open('file.txt') as file:
    for line in itertools.takewhile(lambda x: x != "@\n", file):
        print(line, end="")

値を出力するだけでは読みにくいと思いますが、役に立つ場合もあります (たとえば、値のリストを作成したり、値を別の関数に渡したりして、イテラブルとして便利です)。

于 2013-02-28T19:06:09.090 に答える
0

Lattyware が述べたように、これには正規表現は必要ありません。

コードの問題に関しては、文字列がパターンと一致しない場合、一致オブジェクトではなくre.match返されます。その場合、属性をNone呼び出すことができます。groupこれが例外の理由です: typeNoneインスタンス (インスタンス) であるには、属性がありません。NoneTypegroup

また、re.compileステートメントはループの外にある必要があります。そうしないと、正規表現を明示的にコンパイルしてもあまり意味がありません。

于 2013-02-28T19:09:21.297 に答える