Python模式匹配。匹配'c[任意数量的连续a、b或c等]t

12 投票
5 回答
873 浏览
提问于 2025-04-16 21:17

抱歉标题有点奇怪,我想不出更好的问法。

在Python中,我想找到一个表达式 'c[some stuff]t',其中 [some stuff] 可以是任意数量的连续的 a、b 或 c,顺序也可以随意。

比如,下面这些是符合条件的:

'ct''cat''cbbt''caaabbct''cbbccaat'

但这些就不符合:

'cbcbbaat''caaccbabbt'

补充一下:a、b 和 c 只是举个例子,我其实想扩展到更多的字母。我对正则表达式和非正则表达式的解决方案都感兴趣。

5 个回答

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

这个匹配的是连续出现的 abc(这就是 ([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() 返回的组数要和集合中的元素数量相同。

撰写回答