2016-11-05 61 views
1

我有包含数字(0〜9),字符(A〜Z)和括号(“()”)的字符串。如果包含括号,则必须将括号和内部的数字(或字符)视为在一起。 (8)(8)“或”(2)2(6)2(6)2(2)2然后我需要找到这个字符串中的模式(不重叠)。在这里,字符串,我的意思是它发生两次或更多。就拿在Python中查找字符串中的模式

"(2)2(6)2(6)2(2)2(8)" 

例如,我想提取的模式是

"2(6)", "(2)2" and "(6)2" 

,因为他们发生了两次。和字符串

"(G)8(8)(G)4(C)(G)8(8)" 

,我可以提取

"(G)8(8)" 

。我知道re.compile(r“(。+?)\ 1 +”)。findall(string),这个函数可以找到这个模式,但它不适用于我的情况。谁能帮我?谢谢。

+0

就是定义项的格局:'组together'?它是遵循这个规则:'(字|数字)数字(字|数字)数字....还是'数字(字|数字)数字...'? – Enix

+0

我的意思是模式“)2(6”不被接受,括号和里面的数字(或字符)需要在一起 – pc101

+0

第二个字符串是否还包含符合您的要求的“8(8)”值? –

回答

0

看起来第二个字符串还包含8(8)值,它符合您的要求,因为它在字符串中出现两次。

既然你寻求可以是重叠的比赛,你需要一个捕获组非锚定正向前查找里面:

(?=((?:\([A-Z0-9]+\)|\d){2,}).*\1) 

regex demo

这里,((?:\([A-Z0-9]+\)|\d){2,})捕捉到第1组的( +大写ASCII字母或数字,1个或多个+ )或数字(\d)两个或更多个序列。 \1将需要相同的值出现在任何0+字符之后的某处(如果需要检查多行,请添加re.S修饰符)。

这里是一个online Python demo

import re 
ss = ['(2)2(6)2(6)2(2)2(8)', '(G)8(8)(G)4(C)(G)8(8)'] 
r = r'(?=((?:\([A-Z0-9]+\)|\d){2,}).*\1)' 
for s in ss: 
    print(s) 
    print(re.findall(r, s)) #print([x.group(1) for x in re.finditer(r, s)]) 
    print("---------") 

输出:

(2)2(6)2(6)2(2)2(8) 
['(2)2', '2(6)', '(6)2'] 
--------- 
(G)8(8)(G)4(C)(G)8(8) 
['(G)8(8)', '8(8)'] 
---------