Русская или английская буква в строке
К примеру, у меня есть строка 'Вс{е|e}м прив{е|e}т!', как сделать так, что-бы python уже по готовому выражению подставил либо е русскую, либо e английскую?
Ответы (3 шт):
Можно регуляркой найти текст с {}, пусть будет в found. И вытащить текст внутри {} как found_inner.
Варианты внутри {} можно получить сделав split по |.
А далее сделать замену по found
Пример:
import re
text = 'Вс{е|e}м прив{е|e}т!'
m = pattern.search(r'\{(.+?)\}', text)
found = m.group(0)
found_inner = m.group(1)
items = found_inner.split('|')
print(items)
# ['е', 'e']
text_0 = text.replace(found, items[0])
print(text_0, [ord(c) for c in text_0])
# Всем привет! [1042, 1089, 1077, 1084, 32, 1087, 1088, 1080, 1074, 1077, 1090, 33]
text_1 = text.replace(found, items[1])
print(text_1, [ord(c) for c in text_1])
# Всeм привeт! [1042, 1089, 101, 1084, 32, 1087, 1088, 1080, 1074, 101, 1090, 33]
Возможно, под готовым выражением подразумевалось вот это:
pattern = "Вс{x}м прив{x}т!"
russian_e = 'е'
eng_e = 'e'
print(pattern.format(x=russian_e))
print(pattern.format(x=eng_e))
Вывод:
Всем привет!
Всeм привeт!
Как я понял, заранее знать, какая буква будет заменена, нельзя, поэтому нужно выбрать одну из двух букв из группы и подставить. Код ниже перебирает все буквы и если натыкается на {, включает режим захвата. На } или после выбора буквы режим захвата выключается. Для наглядности вторые буквы в группах выделены капсом.
txt = 'В{с|С}{е|E}м п{р|P}ив{е|E}т!'
for variant in (1,2): # 1 вариант - первая буква из группы, 2 - вторая
out, hook = '', 0
for letter in txt:
if letter == '{':
hook = variant
elif letter == '}':
hook = 0
elif letter != '|':
if hook == 0:
out += letter
elif hook == 1:
out += letter
hook = -1
else:
hook -= 1
print(out)
Всем привет!
ВСEм пPивEт!