Оценка нескольких ИСТИНЫ в Pythton RE Поиск - PullRequest
0 голосов
/ 01 мая 2020

Фон

У меня есть список "плохих слов" в файле bad_words.conf, который выглядит следующим образом (я изменил его, чтобы он был чистым ради этого поста, но в реальной жизни они являются ругательствами);

wrote (some )?rubbish
swore

У меня есть поле ввода пользователя, которое очищается и чередуется с опасными символами, а затем передается как data в следующий скрипт, Score. py (ради этого примера я только что набрал значение для data)

import re

data = 'I wrote some rubbish and swore too'

# Get list of bad words
bad_words = open("bad_words.conf", 'r')
lines = bad_words.read().split('\n')
combine = "(" + ")|(".join(lines) + ")"

#set score incase no results
score = 0

#search for bad words
if re.search(combine, data):
    #add one for a hit
    score += 1

#show me the score
print(str(score))
bad_words.close()

Теперь это находит результат и добавляет оценку 1, как и ожидалось, без al oop .

Вопрос

Мне нужно адаптировать этот скрипт так, чтобы я мог добавлять 1 к баллу каждый раз, когда в тексте обнаруживается строка «bad_words.conf». Таким образом, в приведенном выше примере data = 'I wrote some rubbish and swore too' я бы хотел набрать в общей сложности 2.

1 за «написал несколько рубби sh» и +1 за «присягу».

Спасибо за помощь!

1 Ответ

0 голосов
/ 01 мая 2020

Изменение combine на просто:

combine = "|".join(lines)  

И использование re.findall():

In [33]: re.findall(combine,data)
Out[33]: ['rubbish', 'swore']

Проблема с многократным захватом Группы, как вы изначально делали, состоят в том, что re.findall() будет возвращать каждый дополнительный из них в виде пустой строки, когда совпадает одно из слов.

...