Python — замена строчных букв

#python #string #replace #lowercase

#python #строка #заменить #нижний регистр

Вопрос:

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

Я просто хочу, чтобы все строчные буквы превратились в точки.

Что я здесь делаю не так?

Ответ №1:

Используйте регулярное выражение:

 from re import sub

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

str.replace ищет строку abcdefghijklmnopqrstuvwxyz для ее замены . , а не ищет каждую отдельную букву для замены.

Ответ №2:

вы должны использовать 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'
 

Комментарии:

1. Идиоматически это было бы просто ''.join('.' if chr.islower() else chr for chr in input) .

2. @agf: да, но я всегда чувствовал ''.join(...) , что читает в обратном направлении. поэтому я всегда использую str.join('', ...) .

Ответ №3:

string.lowercase есть 'abcdefghijklmnopqrstuvwxyz' . Ваш код заменяет каждое вхождение всей этой 26-буквенной строки на точку.

Вместо этого вы хотите использовать функцию re модуля sub :

 import re

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

print word2
 

Ответ №4:

Вы пытаетесь заменить строку «abc … xyz» вместо замены каждой строчной буквы. Вы можете достичь желаемого результата несколькими способами:

Регулярные выражения

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

Символ за символом

 "".join('.' if l.islower() else l for l in word)
 

Ответ №5:

я не думаю, что вы можете использовать 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
  '......'
 

Комментарии:

1. Он специально говорит строчные буквы , поэтому w не подходит.