一个字符串由字母和数字组成,但如果它包含一个“c”,那么“c”后面的字母必须是“h”或“k”,有谁知道如何为 Python 编写这样的正则表达式?
问问题
2153 次
3 回答
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
于 2013-01-13T17:10:06.690 回答
0
该表达式^([^\Wc]*(c[hk])*)*$
也有效。它说整个字符串(从^
到$
)必须由重复的块组成,其中每个块有任意数量的非 c 字符,[^\Wc]*
以及任意数量的ch
或ck
对,(c[hk])*
。
例如:
re.search(r'^([^\Wc]*(c[hk])*)*$', 'checkchek').group()
给出
'checkchek'
如果您不想匹配空字符串,请将最后一个替换*
为+
. 通常,当输入字符串不匹配时,为避免出现注释中提到的错误,请将搜索结果分配给变量并测试 not none:
In [88]: y = re.search(r'^([^\Wc]*(c[hk])*)*$', 'ca')
In [89]: if y:
....: print y.group()
....: else:
....: print 'No match'
....:
No match
于 2013-01-13T17:38:52.910 回答
-1
以下代码检测 myinputstring 中是否存在“c not follow by h or k”,如果是,则打印“problem”:
import re
if ((re.findall(r'c(?!(h|k))', myinputstring).length)>0):
print "problem"
于 2013-01-13T17:08:47.760 回答