したがって、本質的には、テキストファイル内の2つの山括弧内の4桁のコードを具体的に探しています。テキストファイルを開いて行ごとに解析する必要があることは知っていますが、「ファイル内の行」をチェックした後、コードを構造化する最善の方法はわかりません。
私は何らかの方法でそれを分割、削除、またはパーティション分割できると思いますが、コンパイルで使用した正規表現も作成したため、一致オブジェクトが返される場合、文字列ベースの操作では使用できないと思います。また、私の正規表現が貪欲かどうかわからない...
見つかったヒットのすべてのインスタンスを、タプルまたはリスト内の文字列として保存したいと思います。
これが私の正規表現です:
regex = re.compile("(<(\d{4,5})>)?")
これまでのところかなり基本的なことを考えれば、それほど多くのコードを含める必要はないと思います。
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())
正規表現に関する注意事項:
?
は不要で、番号を山括弧と一致させたくないが、番号自体のみが必要な場合は外側の(...)
は不要です。更新:matchおよびcapture正規表現ではまったく異なる場合があります。上記のスニペットの正規表現は、パターンwith山カッコと一致しますが、内部番号withoutのみをキャプチャするように依頼しますブラケット。
pythonの正規表現についての詳細は、ここにあります: 正規表現HOWTO
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()
ただし、ファイル全体を一度に読み込む方が適切です。