当前位置: 首页 > 面试题库 >

Python多次重复错误

袁奇玮
2023-03-14
问题内容

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

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

更新
失败的Real代码:

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'

问题答案:

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

你幸运与所有其他转义backslashes-的\s是一样的\\s,没有s;
\(\\(,not(等等相同。但是,您绝不应该依赖幸运,或者假设您完全了解Python转义序列的整个列表。

要么打印出字符串,然后转义丢失的反斜杠(坏),转义 所有 的反斜杠(确定),或者仅使用原始字符串(最佳)。

话虽如此,您发布的regexp不会与它应该匹配的某些表达式匹配,但是它永远不会引发该"multiple repeat"错误。显然,您的实际代码与您显示给我们的代码不同,并且不可能调试我们看不到的代码。

既然您已经展示了一个真实的可重现测试用例,那就是一个 单独的 问题。

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

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

p++在正则表达式来中间的“1以上的1个或多个字母P的”(在其他情况下,同为“1个或多个字母P的”),在一些正则表达式语言,“总是失败”的人,并在其他情况下“引发例外”。Pythonre属于最后一组。实际上,您可以单独进行测试:

>>> re.compile('p++')
error: multiple repeat

如果要将随机字符串放入正则表达式中,则需要调用re.escape它们。

另一个问题(由于Ωmega):

.regexp中的“任何字符”。因此,,|.|;|:"(我刚刚提取了较长的替换链的一小段)意味着“逗号,任何字符,分号或冒号”……与“任何字符”相同。您可能想逃脱.

将所有三个修复程序放在一起:

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在评论中所指出的那样,如果它们都是一个字符长,则不需要使用一系列替换。角色类也会做得更好,更简洁,更易读。

而且我敢肯定,还有其他方法可以改善这一点。



 类似资料: