【问题标题】:Python multiple repeat ErrorPython多次重复错误
【发布时间】:2013-11-25 09:03:29
【问题描述】:

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

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'

【问题讨论】:

  • 您的代码和您在 2.7 或 3.3 上的输入都没有出现此错误。你能给我们一个实际可重现的测试用例吗?
  • 附带说明,您确实应该将原始字符串与正则表达式一起使用。你在这里很幸运,因为你的反斜杠恰好不是 Python 转义序列的一部分,但你永远不应该依赖它。
  • 我正在使用 RegexBuddy 并且该正则表达式显然有效
  • 其实,等等,不,你不会走运的……

标签: python regex


【解决方案1】:

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

所有其他未转义的反斜杠都很幸运——\s\\s 相同,而不是 s\(\\( 相同,而不是 (,以此类推。但是你永远不应该依赖运气,或者假设你知道 Python 转义序列的整个列表。

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


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


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

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

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

在正则表达式中间的p++在某些正则表达式语言中表示“1个或多个字母p中的1个或多个”(在其他情况下,与“1个或多个字母p”相同),在其他人中“总是失败”,在其他人中“引发异常”。 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 在评论中也指出的那样,如果它们都是一个字符长,则不需要使用一连串的交替;一个字符类也可以,更简洁,更易读。

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

【讨论】:

  • 这是一个完全不同的问题。让我编辑我的答案来解释。
  • r"(?:'?s|!+|[,.;:\(\)\"]|\?+)?\s"
  • @Ωmega:很好地发现了原始代码中的第三个错误(在您的编辑中)。交替使用. 有点傻,不是吗……但我们可能应该解释错误,而不是直接修复它而不告诉 OP 它已修复。
  • 我在使用这个正则表达式模式时遇到了同样的错误 - ^('GSP|BG')[-]*[0-9]*+$。删除了第二个*(在+ 之前)并将其更改为^('GSP|BG')[-]*[0-9]+$ - 问题解决了!
【解决方案2】:

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

    if term in string:
         #do whatever

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 2022-12-10
    • 2016-12-17
    • 1970-01-01
    • 2020-08-20
    • 2023-03-09
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多