将一个列表的项目与 python 中的另一个列表匹配

Matching a list's item with another list in python

我有 list1 让我们说:

items=['SETTLEMENT DATE:', 'CASH ACCOUNT:', 'ISIN:', 'TRADE DATE:', 'PRICE CFA', 'CASH ACCOUNT:', 'SECURITY NAME:']

我有一个 list2 让我们说:

split_t=['{1:F01SCBLMUMUXSSU0438794344}{2:O5991054200218SCBLGHACXSSU04387943442002181454N}{3:{108:2175129}}{4:', ':20:EPACK', 'SALE', 'CDI', ':21:EPACK', 'SALE', 'CDI', ':79:ATTN:MU', 'TEAM', 'KINDLY', 'ACCEPT', 'THIS', 'AS', 'AUTHORISATION', 'TO', 'SETTLE', 'TRADE', 'WITH', 'DETAILS', 'BELOW', 'MARKET:', 'COTE', 'DIVOIRE', 'CLIENT', 'NAME:', 'EPACK', 'OFFSHORE', 'ACCOUNT', 'NAME:', 'STANDARD', 'CHARTERED', 'GHANA', 'NOMINEE', 'RE', 'DATABANK', 'EPACK', 'INVESTMENT', 'FUND', 'LTD', 'IVORY', 'COAST', 'TRADE', 'TYPE:', 'DELIVER', 'AGAINST', 'PAYMENT', 'SCA:', '2CEPACKIVO', 'CASH', 'ACCOUNT:', '420551901501', 'TRADE', 'DETAILS:', 'TRADE', 'DATE:', '17.02.2020', 'SETTLEMENT', 'DATE:', '20.02.2020', 'SECURITY', 'NAME:', 'SONATEL', 'ISIN:', 'SN0000000019', 'CLEARING', 'BIC:', 'SCBLCIABSSUXXX', 'QUANTITY:', '10,500', 'PRICE', 'CFA', '14,500.4667', 'CONSIDERATION', 'CFA', '152,254,900.00', 'TOTAL', 'FEES', '1,796,608.00', 'SETTLEMENT', 'AMOUNT', 'CFA', '150,458,292.35', 'CURRENCY:', 'CFA', 'AC:', 'CI0000010373', 'REGARDS', 'STANDARD', 'CHARTERED', 'BANK', '-}']

我想在 list2 中连续搜索 list1 的项目,并且 return list2 的紧接下一个元素存在匹配项。

如您所见,list1 中的一项可能是 list2 中的两个连续项。 例如,list1 的第一个元素 'SETTLEMENT DATE:',list2 中有一个匹配项,我想 return list2 中匹配项的下一个元素,'20.02.2020'。

我已经相应地编写了我的 python 函数:

def test(items, split_t):
    phrases = [w for w in items]
    for i, t in enumerate(split_t):
        to_match = split_t[i+1: i+1+len(phrases)]
        if to_match and all(p == m for p,m in zip(phrases, to_match)):
            return [*map(lambda x:split_t[i])]

returning None 即使它有匹配项,如您所见。我在 return 语句中实现 *map 可能是错误的,我无法从调试中理解它。非常感谢任何帮助。

如果“列表 2”项中没有空格。这样就可以了。

def match(l1, l2):
    result = []
    string = ' '.join(l2) + ' '
    for i in l1:
        index = string.find(i)
        if index != -1:
            result.append(string[index + len(i) + 1:string.find(' ', index + len(i) + 1)])
    return result
print(match(items, split_t))

输出:

['20.02.2020', '420551901501', 'SN0000000019', '17.02.2020', '14,500.4667', '420551901501', 'SONATEL']

一种方法是:

>>> import re
>>> def test(items, split_t):
...     split_t_str = ' '.join(split_t)
...     res = {}
...     for i in items:
...         m = re.search(rf'(?<={i})\s(.*?)\s', split_t_str)
...         res[i] = m.group(1)
...     return res
... 
>>> test(items, split_t)
{'SETTLEMENT DATE:': '20.02.2020', 'CASH ACCOUNT:': '420551901501', 'ISIN:': 'SN0000000019', 'TRADE DATE:': '17.02.2020', 'PRICE CFA': '14,500.4667', 'SECURITY NAME:': 'SONATEL'}

以上:

  1. split_t 创建 str,即 split_t_str
  2. 迭代 items,使用每个元素构建一个正则表达式,以针对 split_t_str
  3. 执行正向回顾断言(参见 re's docs
  4. 将每个元素存储为dict中的键,称为res,并将相应的匹配作为值,并且
  5. returns dict