Ответ 1
Проблема заключается в том, что в неровной строке \"
есть "
.
Вам повезет со всеми вашими необработанными обратными косыми чертами - \s
совпадает с \\s
, а не s
; \(
совпадает с \\(
, а не (
и т.д. Но вы никогда не должны полагаться на получение удачи или считаете, что вы знаете наизусть весь список escape-последовательностей Python.
Либо распечатайте свою строку и избежите обратных косых черт, которые теряются (плохие), избегают всех ваших обратных косых черт (OK) или просто используют исходные строки в первую очередь (лучше всего).
При этом ваше регулярное выражение как отправленное не будет соответствовать некоторым выражениям, которые он должен, но он никогда не повысит эту ошибку "multiple repeat"
. Очевидно, что ваш фактический код отличается от кода, который вы нам показали, и невозможно отлаживать код, который мы не видим.
Теперь, когда вы показали реальный воспроизводимый тестовый пример, это отдельная проблема.
Вы ищете термины, в которых могут быть специальные символы регулярного выражения, например:
term = 'lg incite" OR author:"http++www.dealitem.com" OR "for sale'
То, что p++
в середине регулярного выражения означает "1 или более 1 или более букв p" (в других, то же самое, что "1 или больше буквы p" ) в некоторых языках с регулярным выражением, "всегда терпеть неудачу" в других и "поднимать исключение" в других. Python re
попадает в последнюю группу. Фактически, вы можете проверить это отдельно:
>>> re.compile('p++')
error: multiple repeat
Если вы хотите поместить случайные строки в regexp, вам нужно вызвать re.escape
.
Еще одна проблема (благодаря Ωmega):
.
в регулярном выражении означает "любой символ". Таким образом, ,|.|;|:"
(я только что извлек короткий фрагмент вашей более длинной цепочки чередования) означает "запятая или любой символ или точка с запятой или двоеточие"..., которая совпадает с "любым символом". Вероятно, вам захотелось избежать .
.
Объединяя все три исправления:
term = 'lg incite" OR author:"http++www.dealitem.com" OR "for sale'
regexPart1 = r"\s"
regexPart2 = r"(?:s|'s|!+|,|\.|;|:|\(|\)|\"|\?+)?\s"
p = re.compile(regexPart1 + re.escape(term) + regexPart2 , re.IGNORECASE)
Как указано в комментарии Ωmega, вам не нужно использовать цепочку чередования, если они все один символ длинный; класс символов будет делать то же самое, более сжато и читаемо.
И я уверен, что есть другие способы улучшить это.