Python 分离具有相同潜在起始字符的正则表达式模式匹配

Python 分离具有相同潜在起始字符的正则表达式模式匹配,python,regex,Python,Regex,我想要一个正则表达式,它匹配一行中的几个相同字符,在可能的字符范围内,但不作为一个模式返回这些模式匹配。如何做到这一点 请澄清: 我想要一个以[a-c]开头的模式,并以不加密的方式返回相同字符的任意数量,但不返回范围内的其他字符。在序列“aafaabbybccc”中,它将找到以下模式: (‘aa’、‘aa’、‘bb’、‘b’、‘cccc’) 但不包括以下内容: (‘f’、‘aabb’、‘y’、‘bcccc’) 我不想使用多个正则表达式模式搜索,因为我查找模式的顺序将决定另一个函数的输出。这个问题

我想要一个正则表达式,它匹配一行中的几个相同字符,在可能的字符范围内,但不作为一个模式返回这些模式匹配。如何做到这一点

请澄清:

我想要一个以[a-c]开头的模式,并以不加密的方式返回相同字符的任意数量,但不返回范围内的其他字符。在序列“aafaabbybccc”中,它将找到以下模式:

(‘aa’、‘aa’、‘bb’、‘b’、‘cccc’)

但不包括以下内容:

(‘f’、‘aabb’、‘y’、‘bcccc’)


我不想使用多个正则表达式模式搜索,因为我查找模式的顺序将决定另一个函数的输出。这个问题是为了自学(python),而不是家庭作业。(我还不到15岁,但我会在有可能的时候回来投票。)

问得好。使用正则表达式,如:

(?P<L>[a-c])(?P=L)+
(?P[a-c])(?P=L)+

这是更强大的-你不限于a-c,你可以取代它与a-z如果你喜欢。它首先将a-c中的任何字符定义为
L
,然后查看该字符是否再次出现一次或多次。您想使用此正则表达式运行
re.findall()

您可以使用backreference
\1-\9
捕获先前匹配的第1到第9组

/([a-c])(\1+)/

[a-c]: Matches one of the character.
\1+  : Matches subsequent one or more previously matched character.
Perl:

Python:

>>> import re
>>> [m.group(0) for m in re.finditer(r"([a-c])\1+", 'aafaabbybcccc')]
['aa', 'aa', 'bb', 'cccc']

我认为反向引用是一个更好的解决方案,而不是使用
|
来匹配单个字符。更新了我的答案。这正是我想要的。谢谢。我真的很难让它工作,但我不知道为什么。test=re.findall('(?P[a-c])(?P=L)+',abbracadabbra')--只是将test返回为['b','b']--这是python的问题吗?因为您需要整个字符串而不仅仅是重复的字母,所以必须将整个正则表达式括在括号中。所以类似这样的东西会起作用:[t[0]对于re.findall('((?P[a-c])(?P=L)+','abbracadabbra')]中的t,把整件事放在括号中会使它错过单字母匹配,但我想我现在已经弄明白了。它需要((?P[a-c])(?P=L)*)带星号,因为否则它无法捕获任何短于双字母匹配的内容。非常感谢你的帮助。哦,“*”很贪婪,我是说“?”。很有趣。有关于分组工作原理的好教程吗?@Ceryn有一个关于regex的非常好的教程。提供您想要的内容的良好概述。
>>> import re
>>> [m.group(0) for m in re.finditer(r"([a-c])\1+", 'aafaabbybcccc')]
['aa', 'aa', 'bb', 'cccc']