Python模式匹配。匹配'c[任意数量的连续a、b或c等]t
抱歉标题有点奇怪,我想不出更好的问法。
在Python中,我想找到一个表达式 'c[some stuff]t',其中 [some stuff] 可以是任意数量的连续的 a、b 或 c,顺序也可以随意。
比如,下面这些是符合条件的:
'ct'、'cat'、'cbbt'、'caaabbct'、'cbbccaat'但这些就不符合:
'cbcbbaat'、'caaccbabbt'补充一下:a、b 和 c 只是举个例子,我其实想扩展到更多的字母。我对正则表达式和非正则表达式的解决方案都感兴趣。
5 个回答
3
14
这个还没有经过彻底测试,但我觉得应该可以用:
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
这个匹配的是连续出现的 a
、b
或 c
(这就是 ([abc])\1*
这一部分的意思),而负向前瞻 (?!.*\1)
确保在这段连续字符后面没有出现其他相同的字符。
(编辑:修正了说明中的一个错别字)
6
我不知道你对正则表达式有多依赖,但这里有一个用不同方法的解决方案:
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"
这个字符串是否匹配,取决于中间字符的集合是否是 set('abc')
的一个子集,并且通过 groupby()
返回的组数要和集合中的元素数量相同。