【问题标题】:Why does second try in re.search errors out in second try and works in first try?为什么第二次尝试 re.search 错误在第二次尝试中出现并在第一次尝试中起作用?
【发布时间】:2021-08-19 16:16:44
【问题描述】:

所以,我正在编写 discord bot,我使用 on_message() 来检查消息是否包含禁用词。但是,它在执行过程中给出了类似的错误,所以我尝试创建一个单独的文件来测试错误。这是在 discord bot 中进行类似工作的代码。

from re import search
from re import IGNORECASE
banned_words = (r"N[a-zA-Z0-9]gga")
for banned_word in banned_words:
    if search(banned_word, input("> "), IGNORECASE):
        print("N-word detected")

这是测试

root@kali:~# python3 test.py 
> nigga
N-word detected
> nigga
Traceback (most recent call last):
  File "/root/test.py", line 5, in <module>
    if search(banned_word, input("> "), IGNORECASE):
  File "/usr/lib/python3.9/re.py", line 201, in search
    return _compile(pattern, flags).search(string)
  File "/usr/lib/python3.9/re.py", line 304, in _compile
    p = sre_compile.compile(pattern, flags)
  File "/usr/lib/python3.9/sre_compile.py", line 764, in compile
    p = sre_parse.parse(p, flags)
  File "/usr/lib/python3.9/sre_parse.py", line 948, in parse
    p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
  File "/usr/lib/python3.9/sre_parse.py", line 443, in _parse_sub
    itemsappend(_parse(source, state, verbose, nested + 1,
  File "/usr/lib/python3.9/sre_parse.py", line 549, in _parse
    raise source.error("unterminated character set",
re.error: unterminated character set at position 0

这里可能出了什么问题?它也不应该循环不止一次,对吗?我想知道它是如何询问 input() 两次的。

【问题讨论】:

    标签: python python-3.x regex python-re python-3.9


    【解决方案1】:

    banned_words 是字符串N[a-zA-Z0-9]gga,所以for banned_word in banned_words: 会遍历字符。

    banned_word 的第一个值是字符串N。搜索成功。

    banned_word 的第二个值是字符串[。这本身不是一个有效的正则表达式,它是[...] 字符集的开始。所以你得到一个错误。

    如果banned_words 应该是一个元组,你需要一个逗号:

    banned_words = (r"N[a-zA-Z0-9]gga",)
    

    但是,如果您想测试多个正则表达式,您可以简单地将它们全部放在一个带有 | 交替的正则表达式中:

    banned_words = r"N[a-z0-9]gga|F[a-z0-9]+ck"
    

    然后只进行一次搜索而不是循环。

    【讨论】:

    • 哦,非常棒的通知。我没有意识到它会导致形成字符串而不是没有逗号的元组。我会在 6 分钟内接受这个答案
    【解决方案2】:

    我不明白您通过循环 banned_words 尝试做什么。第一次醒来是因为在第一次迭代中,banned_word 正在从banned_words 获取第一个字符,即 N 并且在您输入的单词中。

    你可以试试这个:

    from re import search,IGNORECASE
    banned_words = (r"N[a-zA-Z0-9]gga")
    
    if search(banned_words, input("> "), IGNORECASE):
            print("N-word detected")
    

    如果您想多次输入,请尝试无限 while 循环:

    while True:
        if search(banned_words, input("> "), IGNORECASE):
            print("N-word detected")
    

    注意:这是无限大循环,没有条件断循环!您可以简单地添加中断条件。

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 2022-08-15
      • 2020-12-11
      相关资源
      最近更新 更多