Доброго времени суток. Сегодня написал программу, которая меняет второе слово с пятым с сохранением знаков препинания на своих позициях. Открывается код с файла. Но проблема в том, что результат выводится с пробелами между словом и знаком препинания. Я подозреваю что-то не так с регулярным выражением. В чем может быть проблема и как исправить?
Код:
import re
def replace_words_in_sentence(sentence):
words_with_punctuation = re.findall(r'[\w]+|[^\w\s]', sentence, re.UNICODE)
words = [word for word in words_with_punctuation if re.match(r'\w+', word)]
if len(words) < 5:
print("В предложении недостаточно слов для выполнения замены.")
return sentence
words[1], words[4] = words[4], words[1]
result_sentence = ' '
word_index = 0
for element in words_with_punctuation:
if re.match(r'\w+', element):
result_sentence += words[word_index] + ' '
word_index += 1
else:
result_sentence += element
return result_sentence.strip()
def main():
input_filename = 'matrix.txt'
with open(input_filename, 'r', encoding='utf-8') as file:
original_sentence = file.read().strip()
print("Исходное предложение:")
print(original_sentence)
modified_sentence = replace_words_in_sentence(original_sentence)
print("\nРезультат:")
print(modified_sentence)
if name == "main":
main()
В этой программе очень простое регулярное выражение: r'\w+'
Функцию replace_words_in_sentence можно упростить, так, чтобы результат был правильным.
Сначала надо извлечь все слова:
words= re.findall(r'\w+', sentence, re.UNICODE)
Затем, если слов достаточно, поменять местами слова с индексами 1 и 4:
words[1], words[4] = words[4], words[1]
Заменить слова строки sentence по тому же самому регулярно у выражению, воспользовавшись методом sub, вместо строки подмены надо использовать lambda функцию замены слов, извлекающую слова из списка words:
re.sub(r'\w+',lambda x:words.pop(0),sentence)
Код функции replace_words_in_sentence:
def replace_words_in_sentence(sentence):
words= re.findall(r'\w+', sentence, re.UNICODE)
if len(words) < 5:
print("Недостаточно слов для выполнения замены.")
return sentence
words[1],words[4]=words[4],words[1]
return re.sub(r'\w+',lambda x:words.pop(0),sentence)
При копировании этого кода в свой проект, потребуется удалить символы форматирования, иначе возникнут ошибки при компиляции.