Вот что вы можете сделать:
import re
input_line = "2*x + (9-5)! + 99! + max! + (x-3)! -4"
pattern = "\(.+?\)(?=!)|[0-9]+(?=!)|[a-z]+(?=!)"
result = re.findall(pattern, input_line)
print(result)
output_line = input_line
for match in result:
if match[0] == '(':
output_line = output_line.replace(f"{match}!", f"math.factorial{match}")
else:
output_line = output_line.replace(f"{match}!", f"math.factorial({match})")
print(output_line)
Сначала создается регулярное выражение "\(.*?\)(?=!)| [0-9]*(?=!)| [a-z]*(?=!)"
, которое затем сопоставляется со строкой ввода. Все совпадения сохраняются в result
.
Затем вы заменяете все совпадения в строке ввода желаемой частью. Выполнение этого приведет к выводу:
2*x + math.factorial(9-5) + math.factorial(99) + math.factorial(max) + math.factorial(x-3) -4
Вы можете сделать это аналогичным образом для других операторов.
EDIT: Я не мог удержаться от попыток еще раз. Это приближается к хорошему решению, но все еще имеет fl aws.
import re
input_line = "2*x + (9-5)! + 99! + max! + (x-3)! -4 * ((7 + 2!)!)"
pattern_1 = "[0-9]+(?=!)"
pattern_2 = "[a-z]+(?=!)"
pattern_3 = "\(.+?\)(?=!)"
result_1 = re.findall(pattern_1, input_line)
output_line = input_line
result_3 = re.findall(pattern_3, output_line)
for match in result_3:
output_line = output_line.replace(f"{match}!", f"math.factorial{match}")
for match in result_1:
output_line = output_line.replace(f"{match}!", f"math.factorial({match})")
result_2 = re.findall(pattern_2, input_line)
for match in result_2:
output_line = output_line.replace(f"{match}!", f"math.factorial({match})")
result_3 = re.findall(pattern_3, output_line)
print(output_line)
Создает вывод:
2*x + math.factorial(9-5) + math.factorial(99) + math.factorial(max) + math.factorial(x-3) -4 * math.factorial((7 + math.factorial(2)))