【发布时间】:2011-12-18 05:33:12
【问题描述】:
>>> import string
>>> word = "hello."
>>> word2 = word.replace(string.lowercase, '.')
>>> print word2
hello.
我只想把所有的小写字母变成句号。
我在这里做错了什么?
【问题讨论】:
标签: python string replace lowercase
>>> import string
>>> word = "hello."
>>> word2 = word.replace(string.lowercase, '.')
>>> print word2
hello.
我只想把所有的小写字母变成句号。
我在这里做错了什么?
【问题讨论】:
标签: python string replace lowercase
from re import sub
print sub("[a-z]", '.', "hello.")
str.replace 正在查找字符串 abcdefghijklmnopqrstuvwxyz 以将其替换为 .,而不是查找要替换的每个单独的字母。
【讨论】:
我不认为你可以使用 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
'......'
【讨论】:
\w不符合要求。
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)
【讨论】:
你应该使用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'
【讨论】:
''.join('.' if chr.islower() else chr for chr in input)。
''.join(...) 读反了。所以我总是使用str.join('', ...)。