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

python正则表达式字母后面必须跟另一个字母,python,regex,Python,Regex,字符串由字母和数字组成,但如果它包含“c”,则“c”后面的字母必须是“h”或“k”,有人知道如何为Python编写这样的正则表达式吗?以下代码检测myinputstring中是否存在“c后面不跟h或k”,如果是,则打印“问题”: 我建议如下: ^(?!.*c(?![hk]))[^\W_]+$ 说明: ^ # Start of string (?! # Assert that it's not possible to match... .* # Any strin

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

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


我建议如下:

^(?!.*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\u]
表示“匹配由
\W
匹配的任何字符,不包括
\u

表达式
^([^\Wc]*(c[hk])*$
也适用。它表示整个字符串(从
^
$
)必须由块的重复组成,其中每个块有任意数量的非c字符,
[^\Wc]*
,以及任意数量的
ch
ck
对,
(c[hk])*

例如:
re.search(r'^([^\Wc]*(c[hk])*)*$,'checkchek').group()

给出
“支票”

如果不想匹配空字符串,请将最后一个
*
替换为
+
。通常,为了避免在输入字符串不匹配时出现注释中提到的错误,请将搜索结果指定给一个变量并测试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

这听起来像是一个家庭作业,如果是的话,你应该用它来标记。@DanielFigueroa:家庭作业标记一直是。@DSM那太糟糕了,我喜欢这个标记。:'(如果它不需要是正则表达式,而您只需要答案,那么
(s.isalnum()和all(s[i+1:i+2]in('h','k'),如果c='c'),则枚举中的i,c)
应该也能很好地工作。@PeterStahl:嗯,你可以总是否定匹配的结果。但是,它不能满足字符串只能包含字母和数字的要求。@TimPietzcker当然,你可以否定这个正则表达式的结果来得到OP想要的结果,但这有多不方便?OP的问题不清楚:w他首先想做什么?@PeterStahl:regex是为匹配文本而设计的。试图使它们与文本不匹配有时需要逻辑上的扭曲。我的regex做OP想要做的一切,但它可读吗?两个带有两个简单regex的
if
语句可能比一个巨型regex更好。
re.search(r'^([^\Wc]*(c)[hk]*$,'ca')。group()
抛出一个错误。@b例如,是的,group()只是用于一个简单的匹配示例。请参见编辑。我是这样尝试的:regex=re.compile(“^(?)*c(?![hk])[^\W_]+$”)regex.match(“test”)这让我得到了“test”包含“ch”或“ck”的结果,这显然不是真的!?@user1606657:请阅读正则表达式的注释。它匹配一个仅由字母/数字组成的字符串,除非存在一个不属于ch/ck的c。这正是你所要求的,不是吗?不,不完全是,如果它存在,则每个字符串都应该是有效的不包含“c”,如果它包含“c”,则“c”后面必须跟“h”或“k”,那么它也是有效的,例如“test”->valid,“check”->valid,“tick”->valid,“cow”->NOTVALID,“pic”->NOTVALID@user1606657:是的,这正是您从这个正则表达式得到的结果。请参阅我的编辑。
>>> 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
In [88]: y = re.search(r'^([^\Wc]*(c[hk])*)*$', 'ca')

In [89]: if y:
   ....:     print y.group()
   ....: else:
   ....:     print 'No match'
   ....:     
No match