掌握 Python 中的部分匹配

Mastering Partial Matches in Python

我正在尝试掌握告诉 python 如何部分匹配值的艺术。

这是独家新闻。 correct_list 是 'correct' 数据框,而 list_to_be_audited_partial_matches_ok 是我要确保正确的数据框。不过,这里提出的问题很棘手:list_to_be_audited_partial_matches_ok 中的值可能与 correct_list 中的相应值完全匹配,也可能不完全匹配。

list_to_be_audited_partial_matches_ok 中的值可能对 correct_list 中的部分有某种扩展;例如,扩展名可以用“:”或“-”表示。

以下是我需要考虑的一些示例 'partial match:'

correct_list = {'Item': ["ABCDEF", "FEDCBA", "AA-BB-CCCC", "ABCDEFGH-IJK"]}
correct_list = pd.DataFrame(df1)
correct_list

list_to_be_audited_partial_matches_ok = {'Item': ["ABCDEF", "FEDCBA:XA", "AA-BB-CCCC-01", "AA-BB-CCCC-21:ABC", "ABCDEFGH-IJK-1X"]} 
list_to_be_audited_partial_matches_ok = pd.DataFrame(df2)
list_to_be_audited_partial_matches_ok

这是一张对部分匹配进行颜色编码的图片:

我的最后一点请求是计算列出的所有部分匹配项。

关于如何部分匹配这些值的任何想法?也许一个新列显示 'True/False' 取决于是否存在部分匹配?

为什么这行不通?


我收到的错误消息:

您可以删除最后一个 - 中的字符串部分(优先考虑连字符,因为您的示例证明 : 字符可以在 - 之后删除)直到字符串结尾,或者从最后一个 : 到字符串结尾,然后检查试听的字符串是否与正确列表中的任何字符串匹配。

import pandas as pd
import re

correct_list = {'Item': ["ABCDEF", "FEDCBA", "AA-BB-CCCC", "ABCDEFGH-IJK"]}
list_to_be_audited_partial_matches_ok = {'Item': ["ABCDEF", "FEDCBA:XA", "AA-BB-CCCC-01", "AA-BB-CCCC-21:ABC", "ABCDEFGH-IJK-1X"]}

df1 = pd.DataFrame.from_dict(correct_list)
df2 = pd.DataFrame.from_dict(list_to_be_audited_partial_matches_ok)

pat = fr'^(?:{"|".join(map(re.escape, df1["Item"]))})$'
df2['Audit Result'] = df2['Item'].str.replace(r'-[^-]*$|:[^:]*$', '', regex=True).str.contains(pat)

输出:

>>> df2
                Item  Audit Result
0             ABCDEF          True
1          FEDCBA:XA          True
2      AA-BB-CCCC-01          True
3  AA-BB-CCCC-21:ABC          True
4    ABCDEFGH-IJK-1X          True

.str.replace(r'-[^-]*$|:[^:]*$', '', regex=True)部分去掉后缀,见regex demo。更多详情:

  • -[^-]*$ - - + - ([^-]*) 以外的零个或多个字符,直到字符串结尾 ($)
  • |
  • :[^:]*$ - : + 除 : ([^:]*) 以外的零个或多个字符,直到字符串结尾 ($).

.str.contains(pat) 检查输入字符串是否完全匹配 df1['Item'] 中的一项。正则表达式看起来像 ^(ABCDEF|FEDCBA|AA-BB-CCCC|ABCDEFGH-IJK)$,参见 its demo