Как исправить программу, чтобы работала верно?

Доброго времени суток. Сегодня написал программу, которая меняет второе слово с пятым с сохранением знаков препинания на своих позициях. Открывается код с файла. Но проблема в том, что результат выводится с пробелами между словом и знаком препинания. Я подозреваю что-то не так с регулярным выражением. В чем может быть проблема и как исправить?

Код:

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()

+2
Жалоба

Ответы (1)

В этой программе очень простое регулярное выражение: 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)

При копировании этого кода в свой проект, потребуется удалить символы форматирования, иначе возникнут ошибки при компиляции.

Ответить
+3
Спасибо большое. Действительно теперь все без отступа работает и код намного меньше.
автор
Ответить
© 2012-2026 myanswer.ru
Все вопросы, размещенные на данном сайте, созданы пользователями или собраны из открытых источников. Связаться