3

そのため、ファイルの各行を正規表現に一致させようとして、次のことを行いました。

import re
regex='\S+\s+(\S{6})\s+VAR'
with open('/home/jyt109/humsavar.txt') as humsavar:
    for line in humsavar:
        match=regex.search(line)
        print match.group(1)

期待される出力は、各行にある特定の6文字ですが、代わりに次のようなエラーが発生します。

Traceback (most recent call last):
  File "exercise.py", line 74, in <module>
    match=regex.search(line)
AttributeError: 'str' object has no attribute 'search'

(以下のリンクから)正規表現をファイルの各行に一致させるには、ファイルを最初にfile.read()によってリストに変換する必要があることがわかりました。

ファイルオブジェクトの複数行の正規表現に一致する

投稿のアドレスを変更するために、もっと簡単な方法はありますか(できれば、2行ではなく1行以上)?

humsavar=open('/home/jyt109/humsavar.txt')
text=humsavar.read()

ありがとう!

4

3 に答える 3

5

そのリンクが言っていることを誤解している可能性があると思います。正規表現の一致が複数行にまたがる可能性がある場合は、 を使用してファイルを読み取る必要がありますfile.read()。改行が一致の一部にならない場合は、ファイルを 1 行ずつ読み取り、各行を個別に一致させることができます。

各行を個別にチェックしたい場合は、 を使用file.readlines()して行のリストを取得するか、ファイル オブジェクトを反復処理できます。次に例を示します。

with open('/home/jyt109/humsavar.txt') as f:
    for line in f:
        match = regex.search(line)

ファイルの内容全体を一度に読み取りたい場合は、次のように 1 行で行います。

text = open('/home/jyt109/humsavar.txt').read()
于 2012-10-03T18:00:08.063 に答える
3

これは簡単なワンライナーです。以下のデータファイルでテストしました。正規表現を使用する場合、以下で行ったようにRaw String Notationを使用すると便利です。データ ファイルがどのようなものかはわかりませんが、指定された検索パターンに一致するファイルを作成しました。

コード

import re
print re.findall(r'\S+\s+(\S{6})\s+VAR', open('/tmp/test.txt').read())

出力

['000001', '000002', '123456']

test.txt

x 000001 VAR
x 000002 VAR
x 123456 VAR
于 2012-10-03T19:42:35.750 に答える
1

.read()ファイルをリストに変換しません (.readlines()します)。代わりに、ファイル全体を文字列に入れます。

しかし、それでも正規表現を使用できます: でコンパイルするとre.MULTILINE、アンカー^$は個々の行の開始と終了に一致します:

>>> regex = re.compile(r"^Match this regex in each line$", re.MULTILINE)
>>> regex.findall(text)

結果は、すべての一致のリストになります。

于 2012-10-03T18:00:09.960 に答える