Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找字符串之间的重复模式_Python_Regex_List - Fatal编程技术网

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,谢谢你的建议。我加上去了。