重复多个字符的正则表达式
有没有办法用正则表达式来匹配一组重复的字符呢?比如说:
ABCABCABCABCABC
我想写个像这样 ABC{5}
的东西,但我知道这样写是不对的。那么有没有其他方法可以实现这个效果呢?
更新:
可以使用嵌套的捕获组吗?比如像这样 (?<cap>(ABC){5})
?
5 个回答
3
(ABC){5}
这个写法应该可以满足你的需求。
5
ABC{5} 可以匹配 ABCCCCC。要匹配 5 个 ABC,你应该使用 (ABC){5}。这里的括号是用来把一组字符放在一起的。你还可以设置出现的次数范围,比如 (ABC){3,5},这可以匹配 ABCABCABC、ABCABCABCABC 和 ABCABCABCABCABC。
(ABC){1,} 表示至少出现 1 次,这和 (ABC)+ 是一样的。
(ABC){0,} 表示可以出现 0 次或更多次,这和 (ABC)* 是一样的。
48
如果你想重复某个正则表达式,可以把它放在括号里。比如说,如果你想让ABC
重复5次:
(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'