62

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

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

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

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

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

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

4

2 に答える 2

68
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 桁に一致します。

更新:正規表現での一致キャプチャはまったく異なる可能性があることを理解することが重要です。上記のスニペットの正規表現は、山かっこのあるパターンと一致しますが、山かっこなしで内部番号のみを取得するように求めています。

Python での正規表現の詳細については、こちらを参照してください: 正規表現 HOWTO

于 2012-05-07T06:14:07.493 に答える
37

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()

ただし、ファイル全体を一度に読み込む方が理にかなっています。

于 2012-05-07T06:13:22.823 に答える