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

时间:2011-07-11 17:42:53

标签: python regex pattern-matching

对标题感到抱歉,我无法想出一个干净的方式来问我的问题。

在Python中我想匹配一个表达式'c [some stuff] t',其中[some stuff]可以是任意数量的连续a,b或c,并且可以任意顺序。

例如,这些工作: 'ct''cat''cbbt''caaabbct''cbbccaat'

但这些不是: 'cbcbbaat''caaccbabbt'

编辑:a,b和c只是一个例子,但我真的希望能够将它扩展到更多的字母。我对正则表达式和非正则表达式解决方案感兴趣。

5 个答案:

答案 0 :(得分: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)确保没有其他实例跑完后该角色出现。

(编辑:修改了解释中的拼写错误)

答案 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()返回的组数与集合中的元素数相同,则字符串匹配。

答案 2 :(得分:3)

我认为您需要明确编码a s,bc s的所有可能排列:

c(a*b*c*|b*a*c*|b*c*a*|c*b*a*|c*a*b*|a*c*b*)t

请注意,这是一个非常低效的查询,可能会回溯很多。

答案 3 :(得分:0)

我不知道Python正则表达式引擎,但听起来你只是想直接写出6种不同的可能顺序。

/c(a*b*c*|a*c*b*|b*a*c*|b*c*a*|c*a*b*|c*b*a*)t/

答案 4 :(得分:0)

AFAIK没有“紧凑”的做法......

c(a*(b*c*|c*b*)|b*(a*c*|c*a*)|c*(a*b*|b*a*))t
相关问题