web-dev-qa-db-ja.com

Python正規表現と文字列/ファイルの操作を組み合わせて、パターンのインスタンスを保存して、テキストファイル内のパターンを検索するにはどうすればよいですか?

したがって、本質的には、テキストファイル内の2つの山括弧内の4桁のコードを具体的に探しています。テキストファイルを開いて行ごとに解析する必要があることは知っていますが、「ファイル内の行」をチェックした後、コードを構造化する最善の方法はわかりません。

私は何らかの方法でそれを分割、削除、またはパーティション分割できると思いますが、コンパイルで使用した正規表現も作成したため、一致オブジェクトが返される場合、文字列ベースの操作では使用できないと思います。また、私の正規表現が貪欲かどうかわからない...

見つかったヒットのすべてのインスタンスを、タプルまたはリスト内の文字列として保存したいと思います。

これが私の正規表現です:

regex = re.compile("(<(\d{4,5})>)?")

これまでのところかなり基本的なことを考えれば、それほど多くのコードを含める必要はないと思います。

38
Carl Carlson
import re
pattern = re.compile("<(\d{4,5})>")

for i, line in enumerate(open('test.txt')):
    for match in re.finditer(pattern, line):
        print 'Found on line %s: %s' % (i+1, match.group())

正規表現に関する注意事項:

  • 末尾に?は不要で、番号を山括弧と一致させたくないが、番号自体のみが必要な場合は外側の(...)は不要です。
  • 山括弧の間の4桁または5桁に一致します

更新:matchおよびcapture正規表現ではまったく異なる場合があります。上記のスニペットの正規表現は、パターンwith山カッコと一致しますが、内部番号withoutのみをキャプチャするように依頼しますブラケット。

pythonの正規表現についての詳細は、ここにあります: 正規表現HOWTO

38
Eli Bendersky

1回の一括読み取りで行う:

import re

textfile = open(filename, 'r')
filetext = textfile.read()
textfile.close()
matches = re.findall("(<(\d{4,5})>)?", filetext)

1行ずつ:

import re

textfile = open(filename, 'r')
matches = []
reg = re.compile("(<(\d{4,5})>)?")
for line in textfile:
    matches += reg.findall(line)
textfile.close()

しかし、ここでも、オフセットカウンターを追加しない限り、返す一致はカウント以外には役に立ちません。

import re

textfile = open(filename, 'r')
matches = []
offset = 0
reg = re.compile("(<(\d{4,5})>)?")
for line in textfile:
    matches += [(reg.findall(line),offset)]
    offset += len(line)
textfile.close()

ただし、ファイル全体を一度に読み込む方が適切です。

20
Josiah