基本的な正規表現の問題
あなたのコードの最大の問題は、あなたの通常のバックスラッシュと角括弧の無償使用であり、表現。それとは別に、あなたは基本的にあなたの問題を正しく解決しようとしています。
バックスラッシュは通常、特殊文字をリテラルにし、通常の文字に特別な意味を与えます。 \[
を実行するたびに、あなたは特定のアプリケーションでは決してしたくないリテラルの開き括弧と一致します。
大括弧はリテラル文字列を示しません。彼らは文字クラスを設定します。つまり、角括弧内の文字は文字列内の対応する文字と一致することができます。具体的には、[--]
はリテラルの二重ダッシュを意味しません。それは、「ダッシュまたはダッシュのいずれかの文字」を意味し、冗長であり、あなたが望むものではありません。
r"\[A-Z]{2}\d+[$][--]\d+"
をはるかに簡単にr"[A-Z]{2}\d+\$--\d+"
に変更する必要があります。必要な文字クラスは、大文字の場合は[A-Z]
です。必要なエスケープされた特殊文字は\$
で、EOLの一致ではなくリテラルドル記号を取得します。
キャプチャ番号
は数字を比較することができるようにするには、あなたの試合の一部をキャプチャする必要があります。これを行うには、括弧を使用してキャプチャグループをマークします。正規表現はr"[A-Z]{2}(\d+)\$--(\d+)"
のようになります。
数値のテキスト表現を変換する必要はありません。文字列が一致しない場合、一致しません。
コンパイルする正規表現
今、あなたのループの反復ごとにre.search
を使用しています。これは、ファイル内のすべての行について正規表現を最初からコンパイルします。小さなファイルでは大したことではありませんが、は大きなファイルに違いがあります。
一般に、正規表現を複数回適用する場合は、re.compile
を使用して事前コンパイルすることを検討してください。コンパイルされたregex
オブジェクトでsearch
メソッドを使用できます。これは同じ方法で動作しますが、はるかに高速です。
行番号
ファイルを反復処理するときenumerate
でファイルイテレータをラップ、行番号を取得するには:
for num, line in enumerate(file):
...
あなたがそこにあれば返却されるように、abc
に行番号を渡すことができます一致している、またはより良いまだ、あなたは完全にabc
を排除することができます。原則としてライン
へ
先頭に追加した要素は、インプレースファイルを変更することは現実的ではありません。ファイルは、ディスク上のバイトの集合です。 @
文字をファイルの任意の場所に挿入する場合は、残りのバイトをすべて移動する必要があります。代わりに、通常、変更したい行を除いて、すべての行が同じである別のファイルに書き込みます。挿入がシームレスに見えるようにするには、完了したら元のファイルを上書きするために結果のファイルを移動します。
これは、出力ファイルを開く必要がありますを意味します。パターンに一致するすべての行に接頭辞@
が書き込まれます。他のすべての行はそのまま渡されます。上記のすべてを組み合わせる
コード
、あなたはこのような何かを得る:それはあまりをしないので、私はabc
機能を取り除く得ている
import re
def main():
pattern = re.compile(r"[A-Z]{2}(\d+)\$--(\d+)")
matches = []
with open(r"filename.txt") as f, open(r"filename.txt.out", "w") as out:
for num, line in enumerate(f):
if line.strip().startswith("RECORD-FEB"):
case = pattern.search(line)
if case and case.group(1) == case.group(2):
matches.append(num)
line = '@' + line
print(line, file=out)
print(matches)
main()
を。すべて一致する行番号number1 == number2
がリストに追加されますmatches
、最後に表示されます。あなたが完了した後、元のファイルを上書きする場合
は、次の操作を行います。
import shutil
...
shutil.move("filename.txt.out", "filename.txt")
だから、問題は何でしょうか。あなたの質問を書いていないか、私たちがあなたの心を読むことを期待しているかのように見えます。 –
関連する入力テキストを入力してください。 – dawg
あなたはどんな出力を期待していますか?何がうまくいかないのですか?エラーが発生していますか?もしそうなら、それを投稿してください。できればスタックトレースを付けてください。 –