问题:一个句子以hi
开头(不区分大小写),后面没有空格和字母d。
我的正则表达式:[hi|HI|hI|Hi][^ d|D][a-zA-Z ]*
但是,我不明白为什么这个字符串hI dave how are you doing
被正则表达式接受了。
我正在使用python re库。
尝试:我尝试过不同的版本[^ ][^d|D]
,但这些版本似乎都不起作用。
答案 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之外,你应该允许一个空格后跟任何东西,如果你没有空格,那么任何字符都可以跟随。