为什么re.findall方法在python中返回错误的结果?

时间:2015-03-11 10:31:37

标签: python regex

我尝试了下面的代码。

re.findall(r'(\d{2}){2}', 'shs111111111')

我希望得到像

这样的结果
11111111

但结果是

['11', '11']

编辑:

我在这个例子中犯了一些错误,我真正需要的是找到所有重复的子串。

像这样:

re.findall(r'([actg]{2,}){2,}', 'aaaaaaaccccctttttttttt')

我更喜欢结果是[' aaaaaaa',' ccccc',' tttttttttt']

但我得到了[' aa',' cc',' tt']

问题是什么,我该怎么办?

3 个答案:

答案 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组的正则表达式,其中包含ab等,然后使用(?P=letter)+)反向引用来匹配所有组重复。

((?P<letter>[a-zA-Z])(?P=letter)+)

您只能将此正则表达式与@ anubhava帖子中描述的finditer一起使用。