2010-09-02 63 views
14

有没有使用正则表达式匹配重复字符集的方法?例如:重复多个字符正则表达式

ABCABCABCABCABC

ABC{5}

我知道这是错误的。但是有什么可以与这种效果相匹配吗?

更新:

您可以使用嵌套的捕获组吗?那么像(?<cap>(ABC){5})

回答

34

用圆括号括起你想要重复的正则表达式。举例来说,如果你要重复5次的ABC

(ABC){5} 

或者,如果你想要的任何数量的重复(0或更多):

(ABC)* 

或者一次或多次重复:

(ABC)+ 

编辑回复更新

正则表达式中的括号会做两件事;他们将正则表达式中的项目序列组合在一起,以便您可以将运算符应用于整个序列而不是最后一个项目,并捕获该组的内容,以便可以提取与该子表达式匹配的子字符串在正则表达式中。

你可以嵌套括号;他们从第一次开场白开始计算。例如:

>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(0) 
'123 ABCDEF' 
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(1) 
'ABCDEF' 
>>> re.search('[0-9]* (ABC(...))', '123 ABCDEF 456').group(2) 
'DEF' 

如果你想避免捕捉当你分组,您可以使用(?:。如果您不希望使用括号来组合序列,以便应用运算符来更改匹配的编号,这会很有帮助。它也更快。

>>> re.search('[0-9]* (?:ABC(...))', '123 ABCDEF 456').group(1) 
'DEF' 

因此,要回答你的更新,是的,你可以使用嵌套捕获组,甚至避免与内组的所有拍摄:

>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(1) 
'ABCABCABCABCABC' 
>>> re.search('((?:ABC){5})(DEF)', 'ABCABCABCABCABCDEF').group(2) 
'DEF' 
+2

我会在这里使用+而不是*,因为*会匹配0次出现的(ABC)。 – Robusto 2010-09-02 20:34:40

+4

(美国广播公司){3,5}也为一系列的重复 – 2010-09-02 20:36:46

+0

哦,哦。我想()只是出于某种原因用于捕获的东西。但这是有道理的。选择第一个 – Falmarri 2010-09-02 20:37:07

1

括号工作“()”用于在更大,更复杂的正则表达式中对字符和表达式进行分组。紧随该组的紧随量词适用于整个组。

(ABC){5} 
3

ABC {5}与ABCCCCC匹配。要匹配5个ABC,您应该使用(ABC){5}。圆括号用于对一组字符进行分组。您还可以设置与ABCABCABC,ABCABCABCABC和ABCABCABCABCABC匹配的(ABC){3,5}等事件的间隔。 (ABC){1,}表示与(ABC)+完全相同的一次或多次重复。(ABC){0,}表示0或更多重复,与(ABC)*完全相同。

0

至于问题更新-

您可以嵌套捕获组。捕获组索引按每个开放表格递增。

(((ABC)*)(DEF)*) 

喂养该正则表达式ABCABCABCDEFDEFDEF,捕获组0匹配整个事情,1也是整个事情,2是ABCABCABC,3是ABC,和图4是DEF(因为星是捕获组之外) 。

如果你有一个捕获组和重复外面内变化,那么事情可能会变得有些靠不住的,如果你不希望它...

(a[bc]*c)* 

饲喂时abbbcccabbc将返回最后与捕获组1匹配,在本例中只是abbc,因为捕获组通过重复操作符重置。