つまり、基本的に、私が求めているのは、辞書を作成せずに、文中のすべての二重文字(aa、bb、cc、ddなど)を「科学」のような同じ単一の単語に置き換える方法があるかどうかです。すべての二重文字で、それらを置き換える必要があります。Pythonでこれを実現できる正規表現を使用した1行のコードはありますか?
そうでない場合は、これを行うためにさらに26行のコードがあると思います。
要求に応じて、ワンライナー:
re.sub(r'([a-z])\1', 'science', inputString)
交換したいAA
が、交換したくない場合aA
:
re.sub(r'([a-zA-Z])\1', 'science', inputString)
置き換えたい場合は、大文字AA
とaA
小文字を区別しないフラグを指定しますre.I
。
re.sub(r'([a-z])\1', 'science', inputString, flags = re.I)
大文字と小文字を区別しないフラグにより、後方参照でも大文字と小文字が区別されない比較が行われることに注意してください。
説明
[]
この説明を読む前に、ドキュメントを読み、正規表現の非常に基本的な、特に文字クラスのコツをつかむことをお勧めします。
(...)
、後の最初の文字はキャプチャグループを意味し(
ません。さて、このルールの例外であり、キャプチャグループでもありますが、名前を付けることができるため、名前付きキャプチャグループと呼ばれます。キャプチャグループは、内部のパターンと一致するテキストの部分に注意して、後で(正規表現または置換文字列で)参照できるようにします。?
(?P<name>..)
\number
は正の数である後方参照number
は、現在のテキストがキャプチャグループによって一致したテキストと同じであるかどうかを確認する方法です。(名前付きキャプチャグループの場合(?P=name)
、同じ機能を使用しますが、構文は異なります)。
([a-z])\1
例として取り上げます。英語のアルファベットをキャプチャします(周囲に[a-z]
注意してください)。()
その直後に\1
、次の文字(または一般的な場合は文字のシーケンス)がキャプチャグループによって一致した文字と同じであることを確認し([a-z])
ます。
辞書を使用する必要はまったくありません。二重文字に一致させるだけです。
>>> import re
>>> re.sub(r'(?P<letter>[a-z])(?P=letter)', 'science', 'some aa doubled dd letters')
'some science doubled science lescienceers'
(?P<name>..)
グループは一致によって参照されるため、(?P=letter)
2文字のみが一致します。これは、もう少し冗長な使用方法であり、r'([a-z])\1'
より自己文書化されています。