60

以下のこのコードを使用して、正規表現を使用してawithを置換して新しいファイルを作成できます。aa

import re

with open("notes.txt") as text:
    new_text = re.sub("a", "aa", text.read())
    with open("notes2.txt", "w") as result:
        result.write(new_text)

この行を複数回使用する必要があるのだろうかと思っていnew_text = re.sub("a", "aa", text.read())ましたが、テキスト内の複数の文字を変更するには、文字列を変更したい他の文字に置き換えますか?

つまりa--> aab--> bbc-->ccです。

そのため、変更したいすべての文字に対してその行を書く必要がありますか、それとももっと簡単な方法があります. おそらく、翻訳の「辞書」を作成するためです。それらの文字を配列に入れる必要がありますか? 私がそうするなら、私は彼らに電話する方法がわかりません。

4

7 に答える 7

72

@nhahtdh によって提案された答えは有効ですが、正規表現操作よりも不透明でないコードを使用し、python の組み込みデータ構造と無名関数機能を利用する正規の例よりも pythonic ではないと主張します。

この文脈では、翻訳の辞書は理にかなっています。実際、この例 (ActiveState http://code.activestate.com/recipes/81330-single-pass-multiple-replace/からコピー)に示すように、それが Python クックブックのやり方です。

import re 

def multiple_replace(dict, text):
  # Create a regular expression  from the dictionary keys
  regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))

  # For each match, look-up corresponding value in dictionary
  return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text) 

if __name__ == "__main__": 

  text = "Larry Wall is the creator of Perl"

  dict = {
    "Larry Wall" : "Guido van Rossum",
    "creator" : "Benevolent Dictator for Life",
    "Perl" : "Python",
  } 

  print multiple_replace(dict, text)

したがって、あなたの場合、辞書を作成して、翻訳したいテキストと一緒にtrans = {"a": "aa", "b": "bb"}渡すことができます。multiple_replace基本的に、その関数が行っていることは、翻訳するすべての正規表現を含む 1 つの巨大な正規表現を作成し、それが見つかったら、ラムダ関数を渡しregex.subて翻訳辞書検索を実行することだけです。

ファイルからの読み取り中にこの関数を使用できます。たとえば、次のようになります。

with open("notes.txt") as text:
    new_text = multiple_replace(replacements, text.read())
with open("notes2.txt", "w") as result:
    result.write(new_text)

Web スクレイピング タスクのために年の月をチェコ語から英語に変換する必要がある場合に、実際にこの正確な方法を本番環境で使用しました。

@nhahtdh が指摘したように、このアプローチの欠点の 1 つは、プレフィックスフリーではないことです。他のディクショナリ キーのプレフィックスであるディクショナリ キーにより、メソッドが壊れます。

于 2013-03-02T13:53:31.903 に答える
25

キャプチャ グループと後方参照を使用できます。

re.sub(r"([characters])", r"\1\1", text.read())

2倍にしたい文字を間に入れます[]。小文字のa, b,の場合c:

re.sub(r"([abc])", r"\1\1", text.read())

置換文字列では、キャプチャ グループによって一致したものを、の整数 (0 を除く)()\n表記で参照できます。最初のキャプチャ グループを参照します。負でない任意の整数 (0 を許可) を指定できる別の表記法があります。式に一致するテキスト全体を参照します。n\1\g<n>n\g<0>


改行を除くすべての文字を 2 倍にしたい場合:

re.sub(r"(.)", r"\1\1", text.read())

すべての文字を 2 倍にしたい場合 (改行を含む):

re.sub(r"(.)", r"\1\1", text.read(), 0, re.S)
于 2013-03-02T13:49:59.080 に答える