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
即可。