Python 查找字符串之间的重复模式
我有以下列表:Python 查找字符串之间的重复模式,python,regex,list,Python,Regex,List,我有以下列表:someList=['blablahix','somethinghihi']我想返回一个列表,其中包含列表中两个元素之间的重复模式(在本例中为'hihi') 以下是我正在做的: p, r = re.compile(r'(.+?)\1+'), [] for i in strList: r.extend(p.findall(i) or [i]) 当我打印r时,它会给我['bla','hi','hi']。我想要的只是['hihi']。我不希望返回'blabla',因为我在列表的
someList=['blablahix','somethinghihi']
我想返回一个列表,其中包含列表中两个元素之间的重复模式(在本例中为'hihi')
以下是我正在做的:
p, r = re.compile(r'(.+?)\1+'), []
for i in strList:
r.extend(p.findall(i) or [i])
当我打印r
时,它会给我['bla','hi','hi']
。我想要的只是['hihi']
。我不希望返回'blabla',因为我在列表的第二个元素中没有'blabla'
我缺少什么?使用操作获取匹配组的交集:
>>> strList = ['blablahihix', 'somethinghihi']
>>> p = re.compile(r'(.+?)\1+')
>>> [set(p.findall(i)) for i in strList]
[{'bla', 'hi'}, {'hi'}]
>>> # from functools import reduce # In Python 3.x
>>> reduce(lambda a, b: a & b, (set(p.findall(i)) for i in strList))
{'hi'}
用于获取在两个匹配中同时出现的公共部分
您需要修改模式或使用,因为根据是否使用捕获组返回的方式;如果模式中存在一个或多个组,则返回组列表,而不是完整匹配字符串的列表
>>> import re
>>>
>>> strList = ['blablahihix', 'somethinghihi']
>>> p = re.compile(r'(.+?)\1+')
>>> reduce(lambda a, b: a & b,
(set(m.group() for m in p.finditer(i)) for i in strList))
{'hihi'}
更新
正如georg所建议的,您可以使用set.intersection(*…)
;不需要使用reduce
>>> set.intersection(*(set(m.group() for m in p.finditer(i)) for i in strList))
{'hihi'}
你的SOMDECT字典或列表是什么?为什么你不期望
hi
,或hih
,或ihi
,或h
,或i
是重复的模式?在任意两个中等长度的字符串之间,可能存在大量共享模式。你可能想考虑是否有另一个你问的问题。也许你真正想要的是两个元素中出现的最大子字符串。对不起,伙计们,我指的是列表而不是dict。我想要的是someList
被迭代,这样“hihi”(这是两个元素之间的重复模式)被返回如果是“repeated”,你的意思是“存在于两个字符串中”,那么hihi
不是唯一的“重复模式”。hihi
的任何子字符串,如ihi
也会重复。如果是这样,那么我猜您真正想要的是一组最大的重复模式。但这可能仍然不是您所期望的。例如,如果您的两个字符串是“axbhicd”和“efhixg”,那么“hihi”“是最大重复模式,“x”也是。我猜他们的措辞不正确,他们实际上是在寻找LCS,而不是“重复”字符串。@georg,我的想法不同,因为OP使用了模式(.+?)\1+/code>;这要求子字符串应该是重复的。啊,好的,我明白了。我会使用set.intersection(*……
而不是reduce then;)@georg,谢谢你的建议。我加上去了。