Python模式匹配。匹配“c”[任何连续的a、b、c或b、c或a等]t

2024-10-01 02:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉这个标题,我想不出一个干净的方式来问我的问题。在

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

例如,这些工作: 'ct'“cat”“cbbt”“CAABCT”“cbbccaat”

但这些不能: “cbcbbaat”“caaccbabbt”

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


Tags: 编辑标题数量表达式方式some例子cat
3条回答

没有经过彻底测试,但我认为这应该有效:

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

这将匹配ab或{}(这是([abc])\1*部分)的运行,而负lookahead (?!.*\1)确保运行后不存在该字符的其他实例。在

(编辑:修正了解释中的一个错误)

我相信您需要显式地编码as、bs和{}s的所有可能的排列:

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

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

不确定如何附加到regex,但下面是一个使用不同方法的解决方案:

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

相关问题 更多 >