python正则表达式字母后面必须跟另一个字母
字符串由字母和数字组成,但如果它包含“c”,则“c”后面的字母必须是“h”或“k”,有人知道如何为Python编写这样的正则表达式吗?以下代码检测myinputstring中是否存在“c后面不跟h或k”,如果是,则打印“问题”: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(?![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