37

我正在尝试确定一个术语是否出现在字符串中。
术语前后必须出现一个空格,也可以使用标准后缀。
例子:

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'
4

2 回答 2

39

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

您对所有其他未转义的反斜杠都很幸运——<code>\s 与\\s, 而不是s; \(\\(、 不(等相同。但是你永远不应该依赖运气,或者假设你知道 Python 转义序列的整个列表。

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


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


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

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

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

p++某些正则表达式语言中,在正则表达式中间表示“1 个或多个字母 p 中的 1 个或多个”(在其他语言中,与“1 个或多个字母 p”相同),在其他语言中表示“总是失败” ,并在其他人中“引发异常”。Pythonre属于最后一组。事实上,你可以单独测试:

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

如果要将随机字符串放入正则表达式中,则需要调用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 在评论中指出的那样,如果它们都是一个字符长,则不需要使用一连串的交替;一个字符类也会做得更好,更简洁,更易读。

而且我确信还有其他方法可以改进这一点。

于 2013-11-12T23:52:53.757 回答
10

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

    if term in string:
         #do whatever
于 2015-07-30T20:32:07.120 回答