>>> import string
>>> word = "hello."
>>> word2 = word.replace(string.lowercase, '.')
>>> print word2
hello.
すべての小文字をピリオドに変えたいだけです。
ここで何が間違っていますか?
正規表現を使用します:
from re import sub
print sub("[a-z]", '.', "hello.")
str.replace
は、置換する個々の文字を探すのではなく、abcdefghijklmnopqrstuvwxyz
それを に置き換える文字列を探しています。.
あなたが使用する必要がありますstring.translate()
:
>>> import string
>>> input = 'abcABCaAbBcC'
>>> input.translate(string.maketrans(string.lowercase, '.'*26))
'...ABC.A.B.C'
関数は、string.maketrans()
関数に適したマッピングの構築を支援するstring.translate()
関数です。
または、ジェネレーターを使用して、文字列を単純に反復することもできます。
>>> str.join('', ('.' if chr.islower() else chr for chr in input))
'...ABC.A.B.C'
string.lowercase
です'abcdefghijklmnopqrstuvwxyz'
。あなたのコードは、その 26 文字の文字列全体のすべての出現箇所をピリオドに置き換えています。
代わりに、re
モジュールのsub
関数を使用します。
import re
word = "hello."
word2 = re.sub('[a-z]', '.', word)
print word2
すべての小文字を置き換えるのではなく、文字列「abc...xyz」を置き換えようとしています。いくつかの方法で目的の結果を得ることができます。
正規表現
from re import sub
sub("[a-z]", '.', "hello.")
文字ごと
"".join('.' if l.islower() else l for l in word)
そのようなマッピングに r*eplace* を使用できるとは思いませんが、単純な正規表現でやりたいことができます。
>>> import re
>>> word = 'hello.'
>>> # the pattern you want to match
>>> ptn = r'[a-z]'
>>> # compile the pattern
>>> pat_obj = re.compile(ptn)
>>> # use the "sub" method to replace text based on a pattern
>>> w2 = pat_obj.sub(".", word)
>>> w2
'......'