2

だから私は一般的にPythonを上手にしようとしていますが、正規表現にreモジュールを使用するのに問題があります。

読み込んでいるコンマ区切りのcsvファイルがあり、コンマ5で終わる行のすべての出現箇所を検索したいので、次のコードを使用しました。

    five_rating = re.compile(r",5$", re.MULTILINE)
    print five_rating.findall(file.read())

しかし、出力がありません。私が使用している正規表現に一致するものは間違いなくあります。PythonregexWebサイトで正規表現をテストしました。それらは私が望むものをモデル化していますが、コードでは機能しません。

私がここで間違っていることは明らかですか?

ああ、私はUbuntuを使用していて、ファイルにはDOSスタイルの行末が必要ですが、この投稿のコードを使用して行末文字を変換しようとしましたが、うまくいきませんでした。

ところで、ここに入力のサンプルがあります:

9605,Ace Ventura: Pet Detective,5
9606,Ace Ventura: Pet Detective,1
9607,Ace Ventura: Pet Detective,4
9608,Ace Ventura: Pet Detective,3
9609,Ace Ventura: Pet Detective,2
9610,Ace Ventura: Pet Detective,4
9611,Ace Ventura: Pet Detective,3
9612,Ace Ventura: Pet Detective,4
9613,Ace Ventura: Pet Detective,5
9614,Ace Ventura: Pet Detective,5
9615,Ace Ventura: Pet Detective,4
9616,Ace Ventura: Pet Detective,1
9617,Ace Ventura: Pet Detective,3
9618,Ace Ventura: Pet Detective,4
9619,Ace Ventura: Pet Detective,3
9620,Ace Ventura: Pet Detective,1
9621,Ace Ventura: Pet Detective,2
9622,Ace Ventura: Pet Detective,3
9623,Ace Ventura: Pet Detective,5
9624,Ace Ventura: Pet Detective,2
9625,Ace Ventura: Pet Detective,2
9626,Ace Ventura: Pet Detective,4
9627,Ace Ventura: Pet Detective,3
9628,Ace Ventura: Pet Detective,1
4

2 に答える 2

1

次のように、入力 (ファイルの可能性があります) を複数行の文字列として指定すると、次のようになります。

st='''9605,Ace Ventura: Pet Detective,5
9606,Ace Ventura: Pet Detective,1
9607,Ace Ventura: Pet Detective,4
9608,Ace Ventura: Pet Detective,3
9609,Ace Ventura: Pet Detective,2
9610,Ace Ventura: Pet Detective,4
9611,Ace Ventura: Pet Detective,3
9612,Ace Ventura: Pet Detective,4
9613,Ace Ventura: Pet Detective,5
9614,Ace Ventura: Pet Detective,5
9615,Ace Ventura: Pet Detective,4
9616,Ace Ventura: Pet Detective,1
9617,Ace Ventura: Pet Detective,3
9618,Ace Ventura: Pet Detective,4
9619,Ace Ventura: Pet Detective,3
9620,Ace Ventura: Pet Detective,1
9621,Ace Ventura: Pet Detective,2
9622,Ace Ventura: Pet Detective,3
9623,Ace Ventura: Pet Detective,5
9624,Ace Ventura: Pet Detective,2
9625,Ace Ventura: Pet Detective,2
9626,Ace Ventura: Pet Detective,4
9627,Ace Ventura: Pet Detective,3
9628,Ace Ventura: Pet Detective,1'''

これは機能します:

import re

for line in st.splitlines():
    m=re.search(r'(^.*,5$)',line)
    if m: print m.group(0) 

またはre.findallバージョン:

print re.findall(r'(^.*,5$)',st, re.MULTILINE)

または(やや紛らわしい私見) re.findall は括弧なしで機能します:

print re.findall(r'^.*,5$',st, re.MULTILINE)

.*「、5$」までのすべてを一致させる意味がないため、あなたのものは機能していません

また、コメントの1つに記載されているようにfile、識別子として使用することは悪い考えです。

Python の文字列処理を使用してこれを行うこともできます。

for line in st.splitlines():
    if line.endswith(',5'): print line

処理する CSV ファイルが本当にある場合は、組み込みの CSV モジュールを使用します。


最後に -- *nix に DOS ファイルがある場合は、'U' を含む open を使用して、Python のユニバーサル ラインサポートを使用します。

with open(...,'rU') as infile:
于 2013-02-07T14:56:45.227 に答える
1

ここでは正規表現は必要ないことに注意してください。

with open('file') as f:
    lines = [l.strip() for l in f.readlines() if l.strip().endswith(',5')]

print(list(lines))
>>> ['9605,Ace Ventura: Pet Detective,5', '9613,Ace Ventura: Pet Detective,5', '9614,Ace Ventura: Pet Detective,5', '9623,Ace Ventura: Pet Detective,5']
于 2013-02-07T15:02:58.083 に答える