Regex 为什么使用正则表达式在字符串中查找特殊字符时条件返回True?

Regex 为什么使用正则表达式在字符串中查找特殊字符时条件返回True?,regex,string,python-3.x,if-statement,Regex,String,Python 3.x,If Statement,我需要验证变量名: name = ["2w2", " variable", "variable0", "va[riable0", "var_1__Int", "a", "qq-q"] 只有名称“variable0”、“var\u 1\u Int”和“a”是正确的 我可以使用regex识别大多数变量的“错误”名称: import re if re.match("^\d|\W|.*-|[()[]{}]", name): print(False) else: print(True)

我需要验证变量名:

name = ["2w2", " variable", "variable0", "va[riable0", "var_1__Int", "a", "qq-q"]
只有名称“variable0”、“var\u 1\u Int”和“a”是正确的

我可以使用
regex
识别大多数变量的“错误”名称:

import re
if re.match("^\d|\W|.*-|[()[]{}]", name):
    print(False)
else:
    print(True)
然而,对于
va[riable0
,我仍然成为
True
的结果。为什么会这样? 我控制所有类型的括号。

您的表达式是:

"^\d|\W|.*-|[()[]{}]"
但是
re.match()
总是从字符串的开头匹配,因此您的
^
是不必要的,但是您需要在末尾添加
$
,以确保整个输入字符串匹配,而不仅仅是前缀匹配。

您的表达式是:

"^\d|\W|.*-|[()[]{}]"
但是
re.match()
总是从字符串的开头开始匹配,因此您的
^
是不必要的,但是您需要在末尾添加一个
$
,以确保整个输入字符串匹配,而不仅仅是前缀。

.match()
只在字符串的开头检查匹配,而
.search()
检查字符串中的任何位置是否匹配

您还可以将正则表达式简化为以下形式,并调用
search()
方法:

^\d|\W
这基本上检查输入中的第一个字符是数字还是非单词

代码:

>>> name = ["2w2", " variable", "variable0", "va[riable0", "var_1__Int", "a", "qq-q"]
>>> pattern = re.compile(r'^\d|\W')
>>> for str in name:
...     if pattern.search(str):
...             print(str + ' => False')
...     else:
...             print(str + ' => True')
...
2w2 => False
 variable => False
variable0 => True
va[riable0 => False
var_1__Int => True
a => True
qq-q => False
.match()
仅在字符串开头检查匹配项,而
.search()
检查字符串中任何位置的匹配项

您还可以将正则表达式简化为以下形式,并调用
search()
方法:

^\d|\W
这基本上检查输入中的第一个字符是数字还是非单词

代码:

>>> name = ["2w2", " variable", "variable0", "va[riable0", "var_1__Int", "a", "qq-q"]
>>> pattern = re.compile(r'^\d|\W')
>>> for str in name:
...     if pattern.search(str):
...             print(str + ' => False')
...     else:
...             print(str + ' => True')
...
2w2 => False
 variable => False
variable0 => True
va[riable0 => False
var_1__Int => True
a => True
qq-q => False

对!我已经更正了我的表达式,现在它搜索整个字符串:
“\d |\W |.-[124;[()[]{}]$”
,结果是
True
,而不是
False
,再次搜索变量
“va[riable0”
。regex找到的输出是:
['[','0']
。对!我已经更正了我的表达式,现在它搜索整个字符串:
“\d |\W |.-[()[]{}]$”
,结果是
True
,而不是
False
,再次搜索变量
“va[riable0”
。regex找到的输出是:
['['[','0']
。这显然是一个更好的解决方案。您可以说,我的问题出在哪里?为什么即使执行了False语句的条件,我也得到了True而不是False?
。match()
只在字符串的开头检查匹配项,而
.search()
检查字符串中的任何位置是否匹配。连字符或括号也是非单词字符,因此只需
|W
即可处理它们。这显然是一个更好的解决方案。您能说一下,我的问题出在哪里吗?为什么即使执行了False语句的条件,我也得到了True而不是False?
.match()
仅在字符串开头检查匹配项,而
.search()
检查字符串中任何位置的匹配项。此外,连字符或括号是非单词字符,因此只需
|W
即可。