为什么第二次尝试 re.search 会在第二次尝试时出错并在第一次尝试时起作用?
Why does second try in re.search errors out in second try and works in first try?
所以,我在编写 discord 机器人程序时使用 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() 两次的。
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"
然后只进行一次搜索而不是循环搜索。
我不明白你想通过循环 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")
注意:这是无限循环,没有条件打破循环!您可以简单地添加中断条件。
所以,我在编写 discord 机器人程序时使用 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() 两次的。
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"
然后只进行一次搜索而不是循环搜索。
我不明白你想通过循环 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")
注意:这是无限循环,没有条件打破循环!您可以简单地添加中断条件。