Python多次重复错误

Pre*_*sen 25 python regex

我正在尝试确定某个术语是否出现在字符串中.
术语之前和之后必须出现空格,并且还允许使用标准后缀.
例:

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

term: dog
string: "I love dogs "
result: found
Run Code Online (Sandbox Code Playgroud)

我正在尝试以下代码:

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

并得到错误:

raise error("multiple repeat")
sre_constants.error: multiple repeat
Run Code Online (Sandbox Code Playgroud)

更新
失败的真实代码:

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)
Run Code Online (Sandbox Code Playgroud)

另一方面,以下term顺利通过(+而不是++)

term = 'lg incite" OR author:"http+www.dealitem.com" OR "for sale'
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 33

问题是,在非原始字符串中,\"".

你很幸运,你所有其他未转义的反斜杠 - \s是相同的\\s,不是s; \(与...相同\\(,不是(,等等.但是你永远不应该依赖于幸运,或者假设你完全了解Python转义序列的整个列表.

打印出你的字符串并转义丢失(坏)的反斜杠,逃避所有的反斜杠(OK),或者首先使用原始字符串(最好).


话虽如此,你发布的正则表达式与它应该的某些表达式不匹配,但它永远不会引发"multiple repeat"错误.显然,您的实际代码与您向我们展示的代码不同,并且无法调试我们看不到的代码.


现在您已经展示了一个真正可重现的测试用例,这是一个单独的问题.

您正在搜索可能包含特殊正则表达式字符的术语,如下所示:

term = 'lg incite" OR author:"http++www.dealitem.com" OR "for sale'
Run Code Online (Sandbox Code Playgroud)

p++在正则表达式的中间表示"1个或更多的1个或多个字母P的"(在其他情况下,同为"1个或多个字母P的"),在一些正则表达式语言,"总是失败"的人,并在其他人"提出例外".Python re属于最后一组.实际上,您可以单独测试它:

>>> re.compile('p++')
error: multiple repeat
Run Code Online (Sandbox Code Playgroud)

如果要将随机字符串放入正则表达式,则需要调用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)
Run Code Online (Sandbox Code Playgroud)

正如Ωmega在评论中指出的那样,如果它们都是一个字符长,则不需要使用一系列替换; 一个角色类也会做得更好,更简洁,更可读.

我相信还有其他方法可以改进.


小智 7

另一个答案很好,但我想指出,使用正则表达式在其他字符串中查找字符串并不是最好的方法.在python中简单地写:

    if term in string:
         #do whatever
Run Code Online (Sandbox Code Playgroud)