我想检查单词是否足够长并且仅在字符串末尾包含符号()1234567890!?_@#$%^&*.,'
。条件是下一个:
我决定使用正则表达式:
def check_word(word: str) -> bool:
m = re.match("[^()1234567890!?_@#$%^&*.,]{4,}[()1234567890!?_@#$%^&*.,]*", word)
if m is not None:
return True
return False
print(check_word("Hell,oo")) # False
print(check_word("Hello,!")) # True
print(check_word('Hello"')) # False
所以我的问题是为什么我要True
print(check_word("Hell,oo")
{} {}} {}} {}} {}}}}}}}}}}}}}}}}}}如果符号re.match
甚至不在列表中,print(check_word('Hello"'))
为True
的原因是什么?
答案 0 :(得分:2)
您应添加^
和$
以指示字符串的开头和结尾。 ^
隐含match()
,如评论中所示,因此您只需指定$
即可。re.match(r'[^()1234567890!?_@#$%^&*.,]{4,}[()1234567890!?_@#$%^&*.,]*$', 'Hell,oo')
。这是一个例子:
+
但是,由于要求该字符串包含符号,因此*
匹配零个字符或更多字符时,您应使用*
代替+
,而*
1}}匹配一个或多个字符。或者使用指定的数字替换{4,}
,就像使用print(check_word('Hello"'))
一样。
对于你的问题:
如果符号
True
甚至不在列表中,'"'
为[^()1234567890!?_@#$%^&*.,]
的原因是什么?
这是因为"
。这匹配此集合中不的任何字符,并且[a-zA-Z]
不在其中。要解决此问题,您可以使用 re.match(r'[a-zA-Z]{4,}[()1234567890!?_@#$%^&*.,]*$', 'Hell,oo')
,而不是匹配任何字母英文字符:
arr.find(Boolean)