Есть ли способ легко поменять два символа в строке? - PullRequest
0 голосов
/ 25 октября 2019

например, ввод:

text = 'wish you “happy” every (day)'

ожидаемый вывод:

text = 'wish you (happy) every “day”'

Я бы хотел поменять скобки с цитатами повсюду в неизвестном тексте. Я делаю школьное задание, и мне НЕ разрешают использовать список !!! Поскольку строки неизменяемы, я не уверен, что делать дальше. пожалуйста, помогите 100

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Промежуточная замена обычно уязвима, поскольку текст может содержать промежуточное представление: ###...### в ответе Рупака Неллиата, * и ^ в "глупом" ответе Райана (РЕДАКТИРОВАТЬ: как отмечено в более серьезном тексте Райана)ниже).

Вот решение для регулярных выражений без промежуточной замены:

text = 'wish you "happy" every (day)'
def replacer(match):
    quote, content = match.groups()
    if quote:
        return f'({content})'
    else:
        return f'"{content}"'
re.sub(r'(?:(")|\()(.*?)(?(1)"|\))', replacer, text)
# => 'wish you (happy) every "day"'

Регулярное выражение будет соответствовать начальному разделителю (либо " или (), затем содержанию,и соответствующий конечный разделитель (т. е. если начальный разделитель был ", то ", если нет, то )). Затем функция заменителя создает замену с другим набором разделителей.

1 голос
/ 25 октября 2019

Вот глупый ответ с использованием string.replace ():

text = 'wish you “happy” every (day)'

text = text\
    .replace('”', '*')\
    .replace('“', "^")\
    .replace("(", '“')\
    .replace(")", '”')\
    .replace("*", ')')\
    .replace("^", '(')

Вот серьезный ответ:

Поскольку у вас есть список символов для замены, создайте словарь того или иного символаследует поменять местами с другим символом, затем выполнить итерацию по строке и создать новую строку, которая содержит исходную строку с замененными буквами. Таким образом, вы можете иметь столько строк или всего несколько строк в словаре переключателей, сколько захотите, и это будет работать без изменений. В более широком масштабе, вы можете захотеть сделать что-то вроде хранения этого словаря в другом месте, например, если вы создаете его на основе пользовательского ввода, получаемого из интерфейса или веб-приложения. Часто бывает полезно отделить спецификацию того, что вы делаете, от того, как вы это делаете, потому что один из них можно рассматривать как данные (какие символы нужно поменять местами), а другой - логику (на самом деле их поменять местами).

text = 'wish you “happy” every (day)'

newtext = ''
switch = {
    '“': '(', 
    '”': ')',
    '(': '“', 
    ')': '”',
}

for letter in text:
    if letter in switch: letter = switch[letter]
    newtext += letter

Причина, по которой я выбрал итеративный подход, заключается в том, что мы меняем символы, поэтому, если вы замените все экземпляры каждого символа в одно и то же время, символы поменяются местами после замены следующего, если только вы не включите промежуточный шаг, такой как * в моем глупом ответе или ### в другом ответе, который открывает возможность столкновений (если ваш текст уже содержал ### или *, он был бы неправильно заменен).

неизменность строк - вот почему вы должны создать строку newtext вместо замены символов в исходной строке во время итерации.

0 голосов
/ 25 октября 2019

То, что вам нужно, это заменить регулярное выражение. Кроме того, группа должна быть сохранена.

ПРИМЕЧАНИЕ : мне пришлось использовать 3 замены, потому что произошел обмен.

a = 'wish you "happy" every (day)'
b = re.sub(r'"(\w+)"', r'###\1###', a) 
// replaces words inside double quotes to words inside ###
// b = 'wish you ###happy### every (day)'

c = re.sub(r'\((\w+)\)', r'"\1"', b)
// replaces words inside paranthesis to words inside double quotes
// c = 'wish you ###happy### every "day"'

d = re.sub(r'###(\w+)###', r'(\1)', c)
// replaces the words inside ### to paranthesis
// d = 'wish you (happy) every "day"'
...