2

我希望有一个正则表达式,它在一系列可能的字符范围内连续匹配几个相同的字符,但不将这些模式匹配作为一个模式返回。如何实现?

为了澄清:

我想要一个以 [ac] 开头的模式,并且不贪婪地返回任意数量的相同字符,但不返回范围内的其他字符。在序列“aafaabbybcccc”中,它会找到以下模式:

('aa','aa','bb','b','cccc')

但会排除以下内容:

('f', 'aabb', 'y', 'bcccc')

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

4

2 回答 2

2

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

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

这更健壮 - 您不仅限于 ac,如果您愿意,可以将其替换为 az。它首先将 ac 中的任何字符定义为L,然后查看该字符是否再次出现一次或多次。您想re.findall()使用此正则表达式运行。

于 2012-05-23T03:02:09.913 回答
1

您可以使用反向引用\1 - \9来捕获先前匹配的第 1 到第 9 组。

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

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

珀尔:

perl -e '@m = "ccccbbb" =~ /([a-c])(\1+)/; print $m[0], $m[1]'

cccc

Python:

>>> import re
>>> [m.group(0) for m in re.finditer(r"([a-c])\1+", 'aafaabbybcccc')]
['aa', 'aa', 'bb', 'cccc']
于 2012-05-23T03:07:58.540 回答