坚持检查字符串中的符号

时间:2017-11-05 14:29:22

标签: python regex python-3.x

我想检查单词是否足够长并且仅在字符串末尾包含符号()1234567890!?_@#$%^&*.,'。条件是下一个:

  • 这个词应该超过3个字符长而没有符号。符号' - '算作字符
  • 正确的单词在开头和中间不应包含特殊符号 字符串

我决定使用正则表达式:

    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的原因是什么?

1 个答案:

答案 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)