Русская или английская буква в строке

К примеру, у меня есть строка 'Вс{е|e}м прив{е|e}т!', как сделать так, что-бы python уже по готовому выражению подставил либо е русскую, либо e английскую?


Ответы (3 шт):

Автор решения: gil9red

Можно регуляркой найти текст с {}, пусть будет в 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т!
→ Ссылка