Regex Вопрос: Как я могу проверить, совпадают ли какие-либо из значений в списке?

1

Я хочу создать объект RE, который соответствует, если строка содержит хотя бы один из элементов списка.

Например, если bad_words["censored","stupid","idiot"] - это список, RE будет соответствовать, если хотя бы один из них существует.

Это мой RE: re.compile("(%s)+" % ("|".join(bad_words)), re.IGNORECASE)

Проблема в том, что "youareanidiot" не соответствует. Что мне нужно изменить, чтобы он соответствовал?

  • 1
    Вы имеете в виду содержать вместо состоит ?
Теги:

2 ответа

4
Лучший ответ

Вы используете re.match? Попробуйте re.search. См. Соответствие и поиск из документов регулярного выражения Python.

import re
bad_words = ["stupid", "idiot"]
regex = re.compile("|".join(re.escape(word) for word in bad_words), re.IGNORECASE)
print regex.search('youareanidiot').group()

# prints "idiot"
11

Хотя это можно сделать с регулярным выражением, я думаю, что вам лучше без регулярного выражения. Чтобы проверить строку s на bad_words, попробуйте что-то вроде

s = s.lower()
any(bad in s for bad in bad_words)

Ваш bad_words должен быть в нижнем регистре.

  • 0
    +1 для любого (), я всегда забываю, что один (и все ()) :)
  • 0
    Я только что провел несколько тестов - похоже, что скомпилированное регулярное выражение CPython превзойдет поиск «in» заметной разницей, если искомая строка превышает определенный порог (для меня это равняется примерно 500 символам). также выглядит так, как если бы CPython "in" увеличивал сложность для более длинных строк, даже если это совпадение в начале :)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню