重复多个字符的正则表达式

26 投票
5 回答
57226 浏览
提问于 2025-04-16 03:38

有没有办法用正则表达式来匹配一组重复的字符呢?比如说:

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'

撰写回答