2
>>> import string
>>> word = "hello."
>>> word2 = word.replace(string.lowercase, '.')
>>> print word2
hello.

すべての小文字をピリオドに変えたいだけです。

ここで何が間違っていますか?

4

5 に答える 5

5

正規表現を使用します:

from re import sub

print sub("[a-z]", '.', "hello.")

str.replaceは、置換する個々の文字を探すのではなく、abcdefghijklmnopqrstuvwxyzそれを に置き換える文字列を探しています。.

于 2011-10-30T14:38:26.133 に答える
4

あなたが使用する必要があります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'
于 2011-10-30T14:46:49.200 に答える
3

string.lowercaseです'abcdefghijklmnopqrstuvwxyz'。あなたのコードは、その 26 文字の文字列全体のすべての出現箇所をピリオドに置き換えています。

代わりに、reモジュールのsub関数を使用します。

import re

word = "hello."
word2 = re.sub('[a-z]', '.', word)

print word2
于 2011-10-30T14:39:07.450 に答える
2

すべての小文字を置き換えるのではなく、文字列「abc...xyz」を置き換えようとしています。いくつかの方法で目的の結果を得ることができます。

正規表現

from re import sub
sub("[a-z]", '.', "hello.")

文字ごと

"".join('.' if l.islower() else l for l in word)
于 2011-10-30T14:41:48.907 に答える
1

そのようなマッピングに 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
  '......'
于 2011-10-30T14:38:51.767 に答える