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

Usa*_*agi 12 python regex pattern-matching

抱歉标题,我无法想出一个干净的方式来问我的问题.

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

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

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

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

mhy*_*itz 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
Run Code Online (Sandbox Code Playgroud)

这符合中运行a,bc(这是([abc])\1*一部分),而负先行(?!.*\1)确保该字符的任何其他实例运行后存在.

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


And*_*ark 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"
Run Code Online (Sandbox Code Playgroud)

如果一组中间字符是其子集,则字符串匹配,set('abc')并且返回的组groupby()的数量与集合中的元素数量相同.