Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

произвести замену в шаблоне по условию

#python #python_3x #format


Нужно сформатировать строку (желательно методом format). Строка, например, такая:

string = "words{hello||hello1}words"


А до этой строки задается параметр s=True или s=False, и если s=True, то на выходе
должна получиться вот что:

string = 'wordshellowords'


, а если s=False, то:

string = 'wordshello1words'


Как это сделать?
    


Ответы

Ответ 1



Алгоритм по шагам: string = "words{hello||hello1}words" start = string.index('{') + 1 end = string.index('}') replace_str = string[start: end] print(replace_str) # hello||hello1 var_replace = replace_str.split('||') print(var_replace) # ['hello', 'hello1'] string = string.replace(replace_str, '') print(string) # words{}words s = True if s: new_string = string.format(var_replace[0]) print(new_string) # wordshellowords else: new_string = string.format(var_replace[1]) print(new_string) # wordshello1words В виде функции: def foo(string: str, s=True) -> str: start, end = string.index('{') + 1, string.index('}') replace_str = string[start: end] var_replace = replace_str.split('||') string = string.replace(replace_str, '') # Можно схитрить, т.к. True -- 1, False -- 0 # return string.format(var_replace[not s]) return string.format(var_replace[0] if s else var_replace[1]) string = "words{hello||hello1}words" print(foo(string, True)) # wordshellowords print(foo(string, False)) # wordshello1words Вариант через регулярку: import re def foo(string: str, s=True) -> str: def _on_match(match): var_replace = match.group()[1:-1].split('||') return var_replace[0] if s else var_replace[1] return re.sub('{.+?}', _on_match, string) string = "words{hello||hello1}words" print(foo(string, True)) # wordshellowords print(foo(string, False)) # wordshello1words

Ответ 2



Чтобы выбрать при замене в шаблоне первую альтернативу, когда first=True: import re format_spec = "words{AAA||BBB}words" first = True print(re.sub( "{([^}]+)}", lambda match: match.group(1).split("||")[not first], format_spec, )) Результат: wordsAAAwords Здесь используется, что True == 1, а False == 0, поэтому булевы переменные могут использоваться в качестве индексов. К примеру, [1, 2][True] возвращает 2, а [1, 2][False] возвращает 1.

Ответ 3



string = "wordshello{}words" s = True print(string.format(int(s) or '')) # 'wordshello1words' s = False print(string.format(int(s) or '')) # 'wordshellowords'

Ответ 4



string = 'words{}words' subs = ['hello1', 'hello'] s = True print(string.format(subs[s])) # wordshellowords Трюк в том, что при преобразовании в целое число True станет 1, а False – 0, и таким образом выбираем элемент по индексу.

Ответ 5



import re string = 'words{hello||hello1}words' parts = re.split(r'[{|}]', string) if s == True: print(parts[0] + parts[1] + parts[-1]) else: print(parts[0] + parts[-2] + parts[-1])

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

Отправить комментарий