Python正则表达式捕获组

Python正则表达式捕获组,python,regex,Python,Regex,我想将string1提取为三个部分: (第一部分和第三部分可以是空字符串) 第一部分:a 第二部分(某些字符串的重复):bcdbcdbcd 第三部分:e string1 = "abcdbcdbcde" 当然,上面的代码不起作用 据我所知,圆括号操作符可以用作正则表达式捕获组或对模式的引用。如何在这两种情况下同时使用圆括号运算符 我想要的是: import re string1 = "abcdbcdbcde" m = re.match("(.*)(.+){2,}(.*)", string1)

我想将string1提取为三个部分: (第一部分和第三部分可以是空字符串)

第一部分:a

第二部分(某些字符串的重复):bcdbcdbcd

第三部分:e

string1 = "abcdbcdbcde"
当然,上面的代码不起作用

据我所知,圆括号操作符可以用作正则表达式捕获组或对模式的引用。如何在这两种情况下同时使用圆括号运算符

我想要的是:

import re

string1 = "abcdbcdbcde"
m = re.match("(.*)(.+){2,}(.*)", string1)
print m.groups()[0], m.groups()[1], m.groups()[2]

如果第二部分应该是相同字符串的重复,可以使用可选的第一部分和第三部分。对于第二部分,您可以使用捕获组和:

或者,如果需要所有捕获组:

^.?(.+)\1+.?$
  • ^
    字符串的开头
  • (.?)
    组1,可选择匹配任何字符
  • 第2组
    • (.+)\3+
      第3组,匹配任何字符,后跟对第3组重复1+GIME的反向引用
  • 关闭第3组
  • (.?)
    第4组,可选择匹配任何字符
  • $
    字符串结尾

我认为不可能完全符合您的要求,因为需要更多的字幕组(至少要重复将相同的字符串与
\1
匹配)

但是您可以尝试
(\w+)(\w+)\3+(\w+)

它将由4个捕获组组成。通常,第一个捕获组将包含
a
,最后一个捕获组将包含
e
,第二个捕获组将包含重复的字符串,其余的不相关

说明:

\w+
-匹配一个或多个单词字符

\3+
-匹配第三个捕获组中捕获的字符串,一次或多次


以下正则表达式应起作用(以下警告):

说明:

^#字符串的开头
(.*)#匹配任意数量的字符,尽可能少,直到。。。
(#(开始捕获组#2)
(.+?)#…匹配字符串(并在组#3中捕获)
\3+#至少重复一次。
)#小组结束#2
(.*)匹配字符串的其余部分
测试一下


警告:如果字符串很长并且没有任何明显的重复,这将具有非常糟糕的性能特征(
O(n!)
,我认为),因为正则表达式引擎必须检查每个子字符串的排列。请参阅。

我对该问题的看法:

^(.*?)((.+?)\3+)(.*)
印刷品:

import re

def match(s, m):
    m = re.match("(.*?)?((?:" + m + "){2,})(.*?)?$", s)
    return (m.groups()[0], m.groups()[1], m.groups()[2]) if m else (None, None, None)

print(match("abcdbcdbcde", "bcd"))
print(match("bcdbcdbcd", "bcd"))
print(match("abcdbcdbcd", "bcd"))
print(match("bcdbcdbcde", "bcd"))
print(match("axxbcdbcdxxe", "bcd"))
print(match("axxbcdxxe", "bcd")) # only one bcd in the middle

第二部分应该是相同字符串的重复吗?像bcd bcd还是ab?
^(.*?)((.+?)\3+)(.*)
import re

def match(s, m):
    m = re.match("(.*?)?((?:" + m + "){2,})(.*?)?$", s)
    return (m.groups()[0], m.groups()[1], m.groups()[2]) if m else (None, None, None)

print(match("abcdbcdbcde", "bcd"))
print(match("bcdbcdbcd", "bcd"))
print(match("abcdbcdbcd", "bcd"))
print(match("bcdbcdbcde", "bcd"))
print(match("axxbcdbcdxxe", "bcd"))
print(match("axxbcdxxe", "bcd")) # only one bcd in the middle
('a', 'bcdbcdbcd', 'e')
('', 'bcdbcdbcd', '')
('a', 'bcdbcdbcd', '')
('', 'bcdbcdbcd', 'e')
('axx', 'bcdbcd', 'xxe')
(None, None, None)