我试图确定某个词是否出现在字符串中 术语之前和之后必须出现空格,并且也允许使用标准后缀 示例:
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'
答案 0 :(得分:32)
问题在于,在非原始字符串中,\"
为"
。
对于所有其他未转义的反斜杠,您很幸运 - \s
与\\s
相同,而不是s
; \(
与\\(
相同,而不是(
,依此类推。但是你永远不应该依赖于获得幸运,或者假设你完全了解Python转义序列的整个列表。
打印出你的字符串并转义丢失(坏)的反斜杠,转义所有反斜杠(OK),或者只是首先使用原始字符串(最好)。
话虽如此,你发布的正则表达式与它应该的某些表达式不匹配,但它永远不会引发"multiple repeat"
错误。显然,您的实际代码与您向我们展示的代码不同,并且无法调试我们看不到的代码。
现在您已经展示了一个真正可重现的测试用例,这是单独的问题。
您正在搜索可能包含特殊正则表达式字符的字词,例如:
term = 'lg incite" OR author:"http++www.dealitem.com" OR "for sale'
正则表达式中间的p++
表示“一个或多个字母p中的一个或多个”(在其他字符中,与“字母p中的1个或更多”相同)在某些正则表达式中语言,在其他语言中“永远失败”,在其他语言中“引发异常”。 Python的re
属于最后一组。实际上,您可以单独测试它:
>>> 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在评论中指出的那样,如果它们都是一个字符长,则不需要使用一系列替换;一个角色类也会做得更好,更简洁,更可读。
我确信还有其他方法可以改进。
答案 1 :(得分:6)
另一个答案很好,但我想指出使用正则表达式在其他字符串中查找字符串并不是最好的方法。在python中只需写:
if term in string:
#do whatever