regex Python多个重复错误

hgb9j2n6  于 2023-10-22  发布在  Python
关注(0)|答案(5)|浏览(136)

我正在判断一个词是否出现在字符串中。
术语前后必须出现空格,也允许使用标准后缀。
范例:

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

oymdgrw71#

问题是,在非原始字符串中,\""
幸运的是,所有其他未转义的反斜杠-\s\\s相同,而不是s; \(\\(相同,而不是(,依此类推。但是你永远不应该依赖运气,或者假设你已经记住了Python转义序列的整个列表。
要么打印出你的字符串并转义丢失的反斜杠(坏),转义 * 所有 * 反斜杠(好),或者直接使用原始字符串(最好)。
也就是说,您发布的regexp不会匹配它应该匹配的某些表达式,但它永远不会引发"multiple repeat"错误。显然,您的实际代码与您向我们展示的代码不同,并且不可能调试我们看不到的代码。
既然您已经展示了一个真实的可重现的测试用例,那就是一个 * 单独的 * 问题了。
您正在搜索可能包含特殊regexp字符的术语,如下所示:

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在评论中指出的,如果它们都是一个字符长,你不需要使用一系列的替换;一个字符类也可以,更简洁,更易读。
我相信还有其他方法可以改进。

rfbsl7qr

rfbsl7qr2#

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

if term in string:
    # do whatever
iih3973s

iih3973s3#

还要确保你的论点是在正确的顺序!
我试着在一些html代码上运行一个正则表达式。我一直得到多个重复错误,即使是非常简单的模式,只有几个字母。
原来我把模式和html弄混了。我试了re.findall(html, pattern)而不是re.findall(pattern, html)

m4pnthwp

m4pnthwp4#

我有一个example_str =“我爱你c++”当使用正则表达式get错误多个重复错误。我在这里得到的错误是因为字符串包含“++”,这相当于正则表达式中使用的特殊字符。我的修正是使用re.escape(example_str),这是我的代码。

example_str = "i love you c++" 

regex_word = re.search(rf'\b{re.escape(word_filter)}\b', word_en)
6yt4nkrj

6yt4nkrj5#

“多个重复”的一般解决方案是使用re.escape来匹配文字模式。范例:

>>>> re.compile(re.escape("c++"))
re.compile('c\\+\\+')

但是,如果你想匹配一个在前后都有空格的文字,试试这个例子:

>>>> re.findall(rf"\s{re.escape('c++')}\s", "i love c++ you c++")
[' c++ ']

相关问题