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