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