【问题标题】:python regex letter must be followed by another letterpython 正则表达式字母后面必须跟另一个字母
【发布时间】:2013-01-14 18:52:23
【问题描述】:

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

【问题讨论】:

  • 这听起来像是一个家庭作业,如果是的话,你应该用它来标记它。
  • @DanielFigueroa:作业标签是deprecated
  • @DSM 太糟糕了,我喜欢那个标签。 :'(
  • 如果它不需要是正则表达式,而您只想要答案,那么(s.isalnum() and all(s[i+1:i+2] in ('h', 'k') for i, c in enumerate(s) if c == 'c')) 应该同样有效。

标签: python regex


【解决方案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

【讨论】:

  • 我试过这样: regex = re.compile("^(?!.*c(?![hk]))[^\W_]+$") regex.match(" test") 得到的结果是 'test' 包含 'ch' 或 'ck' 这显然不是真的!?
  • @user1606657:请阅读正则表达式的 cmets。它匹配仅由字母/数字组成的字符串,除非存在不属于 ch/ck 的 c。这正是你所要求的,不是吗?
  • 不,不完全是,如果每个字符串不包含“c”,则它应该是有效的,如果它包含“c”,则“c”必须后跟“h”或“k”那么它也是有效的,例如'test'->valid, 'check'->valid, 'tick'->valid, 'cow'->NOTVALID, 'pic'->NOTVALID
  • @user1606657:是的,这正是你从这个正则表达式中得到的结果。查看我的编辑。
【解决方案2】:

表达式^([^\Wc]*(c[hk])*)*$ 也有效。它说整个字符串(从^$)必须由重复的块组成,其中每个块有任意数量的非c 字符[^\Wc]*,以及任意数量的chck 对, (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

【讨论】:

  • re.search(r'^([^\Wc]*(c[hk])*)*$', 'ca').group() 抛出错误。
  • @btoueg,是的,group() 只是用于一个简单的匹配示例。见编辑。
【解决方案3】:

以下代码检测到 myinputstring 中是否存在“c not follow by h or k”,如果存在则打印“problem”:

import re
if ((re.findall(r'c(?!(h|k))', myinputstring).length)>0):
    print "problem"

【讨论】:

  • @PeterStahl:嗯,你总是可以否定比赛的结果。但是,它没有解决字符串只能包含字母和数字的要求。
  • @TimPietzcker 当然,你可以否定这个正则表达式的结果来得到 OP 想要的,但这有多不方便?
  • OP的问题不清楚:他首先想做什么?
  • @PeterStahl:正则表达式旨在匹配文本。试图使它们匹配文本有时需要逻辑扭曲。我的正则表达式确实做了 OP 想要的一切,但它可读吗?带有两个简单正则表达式的两个if 语句可能比一个巨大的正则表达式更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多