Ошибка повторения нескольких Python

Я пытаюсь определить, появится ли термин в строке.
До и после этого термина должно появиться пробел, и также допускается стандартный суффикс.
Пример:

term: google
string: "I love google!!! "
result: found

term: dog
string: "I love dogs "
result: found

Я пытаюсь использовать следующий код:

regexPart1 = "\s"
regexPart2 = "(?:s|'s|!+|,|.|;|:|\(|\)|\"|\?+)?\s"  
p = re.compile(regexPart1 + term + regexPart2 , re.IGNORECASE)

и получите ошибку:

raise error("multiple repeat")
sre_constants.error: multiple repeat

Обновление
Сбой реального кода:

term = 'lg incite" OR author:"http++www.dealitem.com" OR "for sale'
regexPart1 = r"\s"
regexPart2 = r"(?:s|'s|!+|,|.|;|:|\(|\)|\"|\?+)?\s" 
p = re.compile(regexPart1 + term + regexPart2 , re.IGNORECASE)

С другой стороны, следующий term проходит гладко (+ вместо ++)

term = 'lg incite" OR author:"http+www.dealitem.com" OR "for sale'

Ответы

Ответ 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, вам не нужно использовать цепочку чередования, если они все один символ длинный; класс символов будет делать то же самое, более сжато и читаемо.

И я уверен, что есть другие способы улучшить это.

Ответ 2

Другой ответ велик, но я хотел бы указать, что использование регулярных выражений для поиска строк в других строках - это не лучший способ сделать это. На питоне просто напишите:

    if term in string:
         #do whatever