在模式匹配方面需要帮助

时间:2015-04-14 18:55:37

标签: python regex

问题:一个句子以hi开头(不区分大小写),后面没有空格和字母d。

我的正则表达式[hi|HI|hI|Hi][^ d|D][a-zA-Z ]*

但是,我不明白为什么这个字符串hI dave how are you doing被正则表达式接受了。

我正在使用python re库。
尝试:我尝试过不同的版本[^ ][^d|D],但这些版本似乎都不起作用。

2 个答案:

答案 0 :(得分:4)

您不能在字符类中使用alternation。字符类定义一组字符。说 - “匹配类指定的一个字符”。最简单的方法是在使用内联Negative Lookahead不区分大小写的修饰符和(?i)时实现anchoring

(?i)^hi(?! d).*

说明:

(?i)     # set flags for this block (case-insensitive) 
^        # the beginning of the string
 hi      #   'hi'
 (?!     #   look ahead to see if there is not:
   d     #     ' d'
 )       #   end of look-ahead
.*       # any character except \n (0 or more times)

答案 1 :(得分:1)

字符集只是方括号之间的字符。你不必将它们与|分开,所以这个

 [hi|HI|hI|Hi]

只代表一个字符,h,i,|,H或I.

这就是为什么你的正则表达式匹配" h d dave你是怎么做的"因为第一个字符是h,下一个字符不是空格,d,|或d,最后一个字符匹配零次。

请注意,如果要匹配整个输入,则必须使用锚点来表示字符串的开头或结尾。

所以,你应该将字符串的开头与^匹配,然后匹配h或H中的任何一个,然后是i或I,最后是空格和D,那将是

^[hH][iI]( [^dD]|[^ ])

请注意,除了d或D之外,你应该允许一个空格后跟任何东西,如果你没有空格,那么任何字符都可以跟随。