有没有办法使用正则表达式来匹配重复的字符集?例如:
ABCABCABCABCABC
ABC{5}
我知道这是错的。但有什么能与这种效果相匹配吗?
更新
您可以使用嵌套捕获组吗?那么像(?<cap>(ABC){5})
?
答案 0 :(得分:37)
将要重复的正则表达式括在括号中。例如,如果您想要重复ABC
:
(ABC){5}
或者如果您想要任意数量的重复(0或更多):
(ABC)*
或者一次或多次重复:
(ABC)+
修改以响应更新
正则表达式中的括号做两件事;它们将正则表达式中的一系列项组合在一起,以便您可以将运算符应用于整个序列而不是最后一项,并且它们捕获该组的内容,以便您可以提取与该子表达式匹配的子字符串在正则表达式。
你可以嵌套括号;他们是从第一个开放的paren算起来的。例如:
>>> 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'
答案 1 :(得分:3)
(ABC){5}
应该适合你
答案 2 :(得分:3)
ABC {5}与ABCCCCC相匹配。要匹配5个ABC,您应该使用(ABC){5}。括号用于对一组字符进行分组。您还可以设置与ABCABCABC,ABCABCABCABC和ABCABCABCABCABC匹配的(ABC){3,5}等出现间隔。
(ABC){1,}表示1次或更多次重复,与(ABC)+完全相同。
(ABC){0,}表示0次或更多次重复,与(ABC)*完全相同。
答案 3 :(得分:1)
圆括号“()”用于在更大,更复杂的正则表达式中对字符和表达式进行分组。紧随该小组的量词适用于整个小组。
(ABC){5}
答案 4 :(得分:0)
关于问题的更新 -
您可以嵌套捕获组。捕获组索引每个打开的paren增加。
(((ABC)*)(DEF)*)
提供正则表达式ABCABCABCDEFDEFDEF,捕获组0匹配整个事物,1也是全部,2是ABCABCABC,3是ABC,4是DEF(因为星号在捕获组之外)。
如果你在捕获组中有变异而在外面有重复,那么如果你不期待它就会变得有点不可思议......
(a[bc]*c)*
当输入abbbcccabbc将 last 匹配作为捕获组1返回时,在此示例中仅为abbc,因为捕获组将使用repeat运算符重置。