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 回答