python正则表达式字母必须后跟另一个字母

时间:2013-01-13 17:00:33

标签: python regex

字符串由字母和数字组成,但如果它包含'c',则'c'后面的后面的字母必须是'h'或'k',有没有人知道如何为Python编写这样的正则表达式?< / p>

3 个答案:

答案 0 :(得分:1)

我建议如下:

^(?!.*c(?![hk]))[^\W_]+$

<强>解释

^       # Start of string
(?!     # Assert that it's not possible to match...
 .*     #  Any string, followed by
 c      #  the letter c
 (?!    #  unless that is followed by
  [hk]  #   h or k
 )      #  (End of inner negative lookahead)
)       # (End of outer negative lookahead).
[^\W_]+ # Match one or more letters or digits.
$       # End of string

[^\W_]表示“匹配\w匹配的任何字符,不包括_”。

>>> import re
>>> strings = ["test", "check", "tick", "pic", "cow"]
>>> for item in strings:
...     print("{0} is {1}".format(item,
...           "valid" if re.match(r"^(?!.*c(?![hk]))[^\W_]+$", item)
...           else "invalid"))
...
test is valid
check is valid
tick is valid
pic is invalid
cow is invalid

答案 1 :(得分:0)

表达式^([^\Wc]*(c[hk])*)*$也有效。它表示整个字符串(从^$)必须包含重复的块,其中每个块具有任意数量的非c字符[^\Wc]*和任意数量的{{1 }或ch对,ck

例如:
(c[hk])*

'checkchek'

如果您不想匹配空字符串,请将最后一个re.search(r'^([^\Wc]*(c[hk])*)*$', 'checkchek').group()替换为*。通常,为了避免输入字符串不匹配时注释中提到的错误,请将搜索结果分配给变量并测试不是none:

+

答案 2 :(得分:-1)

以下代码检测myinputstring中是否存在“c后跟h或k”,如果是,则显示“问题”:

import re
if ((re.findall(r'c(?!(h|k))', myinputstring).length)>0):
    print "problem"