我尝试了下面的代码。
re.findall(r'(\d{2}){2}', 'shs111111111')
我希望得到像
这样的结果11111111
但结果是
['11', '11']
编辑:
我在这个例子中犯了一些错误,我真正需要的是找到所有重复的子串。
像这样:
re.findall(r'([actg]{2,}){2,}', 'aaaaaaaccccctttttttttt')
我更喜欢结果是[' aaaaaaa',' ccccc',' tttttttttt']
但我得到了[' aa',' cc',' tt']
问题是什么,我该怎么办?
答案 0 :(得分:1)
re.findall
返回所有组。所以使用
re.findall(r'(?:\d{2}){2}', 'shs111111111')
只需制作论坛non capturing
。
相关文件摘录:
返回字符串中pattern的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包含空匹配,除非它们触及另一场比赛的开头。
(([acgt])\2+)
使用此和
x="aaaaaaaccccctttttttttt"
print [i[0] for i in re.findall(r'(([acgt])\2+)', 'aaaaaaaccccctttttttttt')]
答案 1 :(得分:1)
我相信你需要这个正则表达式:
>>> print re.findall(r'(?:\d{2}){2,}', 'shs111111111');
['11111111']
编辑:根据编辑过的问题,您可以使用:
>>> print re.findall(r'(([actg\d])\2+)', 'aaaaaaaccccctttttttttt');
[('aaaaaaa', 'a'), ('ccccc', 'c'), ('tttttttttt', 't')]
从每对中抓取被捕获的组#1。
使用finditer
:
>>> arr=[]
>>> for match in re.finditer(r'(([actg\d])\2+)', 'aaaaaaaccccctttttttttt') :
... arr.append( match.groups()[0] )
...
>>> print arr
['aaaaaaa', 'ccccc', 'tttttttttt']
答案 2 :(得分:0)
您无法获得纯['aaaaaaa', 'ccccc', 'tttttttttt']
,因为您需要一个捕获组来使用反向引用来检查重复。在这里,您有一个名为letter
组的正则表达式,其中包含a
或b
等,然后使用(?P=letter)+)
反向引用来匹配所有组重复。
((?P<letter>[a-zA-Z])(?P=letter)+)
您只能将此正则表达式与@ anubhava帖子中描述的finditer
一起使用。