0

一个字符串由字母和数字组成,但如果它包含一个“c”,那么“c”后面的字母必须是“h”或“k”,有谁知道如何为 Python 编写这样的正则表达式?

4

3 回答 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]*以及任意数量的chck对,(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 回答