>>> 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
'......'