在 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结尾的公共前缀。

在这里,kite1kite3.mapping都很满意。但kite2不是,因为它只以.json结尾。

我怎样才能找到那些以 .json.mapping.json.analyzer.json 结尾的前缀。

如果这是代码高尔夫,我可能会赢:

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,找到所有以给定后缀结尾的元素,并去除后缀,返回集合的结果。

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

为了简洁起见,我将"end with"缩写为ew,将"后缀"缩写为sx

表达式 s[:-len(sx)] 表示"从 0 开始,从末尾开始len(sx)字符的s子字符串",它具有从末尾剪切后缀的效果。

好吧,您所需要的只是为['.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'}

使用re.match和捕获组来提取每个模式的所有匹配项。然后取结果集合的交集:

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']
string = "n".join(A)
json_prefices = re.findall(r"(.*?).json", string)
mapping_json_prefices = re.findall(r"(.*?).mapping.json", string)
analyzer_json_prefices = re.findall(r"(.*?).analyzer.json", string)
result = list(set(json_prefices) & set(mapping_json_prefices)
               & set(analyzer_json_prefices))

最新更新