我正在判断一个词是否出现在字符串中。
术语前后必须出现空格,也允许使用标准后缀。
范例:
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'
5条答案
按热度按时间oymdgrw71#
问题是,在非原始字符串中,
\"
是"
。幸运的是,所有其他未转义的反斜杠-
\s
与\\s
相同,而不是s
;\(
与\\(
相同,而不是(
,依此类推。但是你永远不应该依赖运气,或者假设你已经记住了Python转义序列的整个列表。要么打印出你的字符串并转义丢失的反斜杠(坏),转义 * 所有 * 反斜杠(好),或者直接使用原始字符串(最好)。
也就是说,您发布的regexp不会匹配它应该匹配的某些表达式,但它永远不会引发
"multiple repeat"
错误。显然,您的实际代码与您向我们展示的代码不同,并且不可能调试我们看不到的代码。既然您已经展示了一个真实的可重现的测试用例,那就是一个 * 单独的 * 问题了。
您正在搜索可能包含特殊regexp字符的术语,如下所示:
p++
位于正则表达式中间,在某些正则表达式语言中表示“1个或多个字母p中的1个或多个”(在其他正则表达式语言中,与“1个或多个字母p”相同),在其他正则表达式语言中表示“总是失败”,在其他正则表达式语言中表示“引发异常”。Python的re
福尔斯属于最后一类。事实上,你可以单独测试一下:如果你想把随机字符串放入一个正则表达式中,你需要对它们调用
re.escape
。还有一个问题(感谢Ωmega):
.
在正则表达式中表示“任何字符”。所以,,|.|;|:"
(我只是提取了你的长交替链的一小部分)意味着“一个逗号,或任何字符,或一个逗号,或一个冒号”......这与“任何字符”是一样的。你可能想逃离.
。把这三个修复放在一起:
正如Ωmega在评论中指出的,如果它们都是一个字符长,你不需要使用一系列的替换;一个字符类也可以,更简洁,更易读。
我相信还有其他方法可以改进。
rfbsl7qr2#
另一个答案很好,但我想指出的是,使用正则表达式在其他字符串中查找字符串并不是最好的方法。在python中简单地写:
iih3973s3#
还要确保你的论点是在正确的顺序!
我试着在一些html代码上运行一个正则表达式。我一直得到多个重复错误,即使是非常简单的模式,只有几个字母。
原来我把模式和html弄混了。我试了
re.findall(html, pattern)
而不是re.findall(pattern, html)
。m4pnthwp4#
我有一个example_str =“我爱你c++”当使用正则表达式get错误多个重复错误。我在这里得到的错误是因为字符串包含“++”,这相当于正则表达式中使用的特殊字符。我的修正是使用re.escape(example_str),这是我的代码。
6yt4nkrj5#
“多个重复”的一般解决方案是使用re.escape来匹配文字模式。范例:
但是,如果你想匹配一个在前后都有空格的文字,试试这个例子: