在python中查找以多个后缀结尾的公共前缀

2024-10-02 04:32:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张绳子的清单。在

A = [
  'kite1.json',
  'kite1.mapping.json',
  'kite1.analyzer.json',
  'kite2.json',
  'kite3.mapping.json',
  'kite3.mapping.mapping.json',
  'kite3.mapping.analyzer.json',
 ]

我需要找到以.json.mapping.json.analyzer.json结尾的公共前缀。在

这里,kite1&;kite3.mapping得到满足。但是kite2不是,因为它只以.json结尾。在

如何找到那些以.json.mapping.json.analyzer.json结尾的前缀。在


Tags: json结尾analyzermappingamp绳子kite3kite1
3条回答

使用^{}capturing groups为每个模式提取所有匹配项。然后取结果集的intersection

import re

s1, s2, s3 = (
    set(m.group(1) for m in (re.match(pattern, s) for s in A) if m) 
    for pattern in (
        r'^(.+)\.json$',          # group(1) is the part within '()'
        r'^(.+)\.mapping\.json$', 
        r'^(.+)\.analyzer\.json$'
    )
)

result = list(s1 & s2 & s3)  # intersection
# ['kite3.mapping', 'kite1']

好吧,您只需要为['.json', '.mapping.json', '.analyzer.json']中的每个后缀收集一组前缀,然后取这些集合的交集:

In [1]: A = [
   ...:   'kite1.json',
   ...:   'kite1.mapping.json',
   ...:   'kite1.analyzer.json',
   ...:   'kite2.json',
   ...:   'kite3.mapping.json',
   ...:   'kite3.mapping.mapping.json',
   ...:   'kite3.mapping.analyzer.json',
   ...:  ]

In [2]: suffixes = ['.json', '.mapping.json', '.analyzer.json']

In [3]: prefixes = {s: set() for s in suffixes}

In [4]: for word in A:
   ....:     for suffix in suffixes:
   ....:         if word.endswith(suffix):
   ....:             prefixes[suffix].add(word[:-len(suffix)])
   ....:             

In [5]: prefixes
Out[5]: 
{'.analyzer.json': {'kite1', 'kite3.mapping'},
 '.json': {'kite1',
  'kite1.analyzer',
  'kite1.mapping',
  'kite2',
  'kite3.mapping',
  'kite3.mapping.analyzer',
  'kite3.mapping.mapping'},
 '.mapping.json': {'kite1', 'kite3', 'kite3.mapping'}}

In [6]: prefixes['.json'] & prefixes['.mapping.json'] & prefixes['.analyzer.json']
Out[6]: {'kite1', 'kite3.mapping'}

如果这是code-golf,我可能会赢:

def ew(sx): 
   return set([s[:-len(sx)] for s in A if s.endswith(sx)])

ew('.analyzer.json') & ew('.mapping.json') & ew('.json')

ew()函数循环使用A,查找以给定后缀结尾的所有元素并去掉后缀,返回集合中的结果。在

使用它,我只计算从三个后缀中的每一个产生的集合的交集。(&是交集的运算符。)

为了简洁起见,我将“ends with”缩写为ew,将“suffix”缩写为sx。在

表达式s[:-len(sx)]的意思是“从0开始的s的子串,从末尾到{}个字符”,它的效果是在结尾处截断后缀。在

相关问题 更多 >

    热门问题