我有一个数据库
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'
答案 0 :(得分:3)
在这种特定情况下,您可以使用贪婪的运算符而不是非贪婪的运算符:
r'(.+)\1+'
*
,+
和?
限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不可取的;如果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