Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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_String_Pattern Matching - Fatal编程技术网

在python中检查两个字符串是否包含相同的模式

在python中检查两个字符串是否包含相同的模式,python,regex,string,pattern-matching,Python,Regex,String,Pattern Matching,我有以下清单: names = ['s06_215','s06_235b','s06_235','s08_014','18:s08_014','s08_056','s08_169'] s06_235b和s06_235,s08_014和18:s08_014重复。但是,如示例所示,命名中没有特定的模式。我需要对列表中的元素进行两两比较: for i in range(0, len(names)-1): for index, value in enumerate(names):

我有以下清单:

names = ['s06_215','s06_235b','s06_235','s08_014','18:s08_014','s08_056','s08_169']
s06_235b
s06_235
s08_014
18:s08_014
重复。但是,如示例所示,命名中没有特定的模式。我需要对列表中的元素进行两两比较:

for i in range(0, len(names)-1):
    for index, value in enumerate(names):
        print names[i], names[index]
然后,我需要检查每一对是否包含相同的字符串,但长度超过
4
。也就是说,
s06_235b
s06_235
s08_014
18:s08_014
将通过该标准,但
s08_056
s08_169
将不通过


如何在Python中实现这一点?

您可以使用“in”操作符查看on变量是否包含另一个

if "example" in "this is an example":
试试这个:

for i in range(0, len(names)-1):
    for index, value in enumerate(names):
       if names[i] in names[index] and len(names[i]) > 4:
          print names[i], names[index]
编辑:
正如tobias_k提到的:注意,只有当整个字符串包含在另一个字符串中时,这才有效。您可以迭代所有的,
将它们与一些不能作为这些字符串一部分的特殊字符连接起来,并使用like
(\w{5,})。*#.\1
在这对字符串中找到一个重复的组。除了在s2中使用
s1进行测试外,如果第二个字符串中只包含第一个字符串的一部分,则也可以进行测试,反之亦然

这里,
(\w{5,})
是至少5个字符的共享子字符串(在本例中来自
\w
类,但可以随意调整),后面是更多字符
*
分隔符(
在本例中),更多填充符
*
,然后是第一组
\1
的另一个实例

p = re.compile(r"(\w{5,}).*#.*\1")
for pair in itertools.combinations(names, 2):
    m = p.search("#".join(pair))
    if m:
        print("%r shares %r" % (pair, m.group(1)))
输出:

('s06_215', 's06_235b') shares 's06_2'
('s06_215', 's06_235') shares 's06_2'
('s06_235b', 's06_235') shares 's06_235'
('s08_014', '18:s08_014') shares 's08_014'
('s08_014', 's08_056') shares 's08_0'
('18:s08_014', 's08_056') shares 's08_0'

当然,您可以调整正则表达式以满足您的需要。例如,如果您不希望重复区域被
\uu
所限定,您可以使用类似于
p=r“([a-z0-9]\w{3,}[a-z0-9]).*\1”

的正则表达式对其进行解析,因此它都处于类似于
s\d\d\ud{2,3}
的相同模式?之后,您只需从列表中获取uniq元素。您编写的示例字符串错误:
s08_214
18:s08_014
彼此不包含。抱歉,更正了它。请注意,这仅在整个字符串包含在其他字符串中时有效,而不是在它们共享某些公共子字符串时有效。还有,你为什么要这样混合
范围
枚举
。谢谢,我会编辑这件衣服。我只是在OPs代码中插入了if语句来显示它的位置。