Замена текста не работает в особых случаях - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть файл списка слов с именем Words.txt, который содержит сотни слов и несколько файлов субтитров (.srt). Я хотел бы просмотреть все файлы субтитров и найти в них все слова в файле списка слов. Если слово найдено, я бы хотел изменить его цвет на зеленый. Это код:

import fileinput
import os
import re

wordsPath = 'C:/Users/John/Desktop/Subs/Words.txt'
subsPath = 'C:/Users/John/Desktop/Subs/Season1'
wordList = []

wordFile = open(wordsPath, 'r')
for line in wordFile:
    line = line.strip()
    wordList.append(line)

for word in wordList:
    for root, dirs, files in os.walk(subsPath, topdown=False):
        for fileName in files:
            if fileName.endswith(".srt"):
                with open(fileName, 'r') as file :
                    filedata = file.read()
                    filedata = filedata.replace(' '  +word+  ' ', ' ' + '<font color="Green">' +word+'</font>' + ' ')
                with open(fileName, 'w') as file:
                    file.write(filedata)

Скажите, что слово "книга" находится в списке и находится в одном из файлов субтитров. Пока это слово в предложении типа «Эта книга удивительна», мой код работает отлично. Однако, когда слово упоминается как «КНИГА», «Книга», и когда оно находится в начале или в конце предложения, код не выполняется. Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 06 сентября 2018

Вы используете str.replace , из документации:

Return a copy of the string with all occurrences of substring old replaced by new

Здесь вхождение означает точное совпадение старой строки, тогда функция попытается заменить слово, окруженное пробелами, например ' book ', которое отличается от ' BOOK ', ' Book ' и ' book'. Давайте рассмотрим несколько случаев, которые также не совпадают:

" book " == " BOOK "  # False
" book " == " book"  # False
" book " == " Book "  # False
" book " == " bOok " # False
" book " == "   book " # False

Одной из альтернатив является использование регулярного выражения, подобного этому:

import re

words = ["book", "rule"]
sentences = ["This book is amazing", "The not so good book", "OMG what a great BOOK", "One Book to rule them all",
             "Just book."]

patterns = [re.compile(r"\b({})\b".format(word), re.IGNORECASE | re.UNICODE) for word in words]
replacements = ['<font color="Green">' + word + '</font>' for word in words]

for sentence in sentences:

    result = sentence[:]
    for pattern, replacement in zip(patterns, replacements):
        result = pattern.sub(r'<font color="Green">\1</font>', result)
    print(result)

выход

This <font color="Green">book</font> is amazing
The not so good <font color="Green">book</font>
OMG what a great <font color="Green">BOOK</font>
One <font color="Green">Book</font> to <font color="Green">rule</font> them all
Just <font color="Green">book</font>.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...