python如何通过正则表达式提取重复的字符串

时间:2015-06-23 11:59:53

标签: python

我有一个数据库

database=['3456734567','qqqqgtcgagagagctacgagaqqqqgtcgagagagctacgagaqqqqgtcgagagagctacgaga']

我希望将重复的字符串提取为 '34567' 'qqqqgtcgagagagctacgaga'

因此我使用以下代码:

def string(s):
    return re.search(r'(.+?)\1+', s).group(1)

print string(data[0]) 
print string(data[1])  

然而它只输出'34567'和'q'

请告诉我如何编辑然后获得结果'qqqqgtcgagagagctacgaga'

4 个答案:

答案 0 :(得分:3)

在这种特定情况下,您可以使用贪婪的运算符而不是非贪婪的运算符:

r'(.+)\1+'

来自documentation

  

*+?限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不可取的;如果RE <.*><H1>title</H1>匹配,则它将匹配整个字符串,而不仅仅是''。在限定符之后添加?使其以非贪婪或最小的方式执行匹配;尽可能少的字符将匹配。在上一个表达式中使用.*?仅匹配<H1>

答案 1 :(得分:2)

删除'?'在你的小组中,它使得+限定符渴望,但你想要一个匹配尽可能多的重复的贪婪。

In [1]: re.match(r'(.+)\1+', 
         'qqqqgtcgagagagctacgagaqqqqgtcgagagagctacgagaqqqqgtcgagagagctacgaga').groups()
Out[1]: ('qqqqgtcgagagagctacgaga',)

答案 2 :(得分:2)

以下表达式应该为您提供所需的结果:

def string(s):
return re.search(r'(.+)\1+', s).group(1)

>>> print string(database[0])
34567

print string(database[1])
qqqqgtcgagagagctacgaga

答案 3 :(得分:-1)

使用.group()只会返回表达式的括号括起的部分。您可以使用.start().end()来获取匹配发生的原始字符串的索引:

def string(s):
    match = re.search(r'(.+?)\1+', s)
    return s[match.start() : match.end()] if match is not None else None