掌握 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。
我正在尝试掌握告诉 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。