import re
words = ['ct', 'cat', 'cbbt', 'caaabbct', 'cbbccaat', 'cbcbbaat', 'caaccbabbt']
pat = re.compile(r'^c(?:([abc])\1*(?!.*\1))*t$')
for w in words:
print w, "matches" if pat.match(w) else "doesn't match"
#ct matches
#cat matches
#cbbt matches
#caaabbct matches
#cbbccaat matches
#cbcbbaat doesn't match
#caaccbabbt doesn't match
from itertools import groupby
words = ['ct', 'cat', 'cbbt', 'caaabbct', 'cbbccaat', 'cbcbbaat', 'caaccbabbt']
for w in words:
match = False
if w.startswith('c') and w.endswith('t'):
temp = w[1:-1]
s = set(temp)
match = s <= set('abc') and len(s) == len(list(groupby(temp)))
print w, "matches" if match else "doesn't match"
没有经过彻底测试,但我认为这应该有效:
这将匹配}(这是
a
、b
或{([abc])\1*
部分)的运行,而负lookahead(?!.*\1)
确保运行后不存在该字符的其他实例。在(编辑:修正了解释中的一个错误)
我相信您需要显式地编码}s的所有可能的排列:
a
s、b
s和{请注意,这是一个非常低效的查询,可能会回溯很多次。在
不确定如何附加到regex,但下面是一个使用不同方法的解决方案:
如果一组中间字符是
set('abc')
的子集,并且groupby()
返回的组数与集合中的元素数相同,则字符串匹配。在相关问题 更多 >
编程相关推荐