0

我有一个包含 2 列的大型保险索赔数据集。一列是声明标识符。另一个是与索赔相关的一大串笔记。

我的目标是通过文本挖掘特定 VIN 号码的索赔说明。通常,VIN# 采用 17 位格式。见下文:https ://www.autocheck.com/vehiclehistory/autocheck/en/vinbasics

但是,根据我的数据,出现了一些问题。有时仅输入最后 6 位数字作为 VIN#。我基本上需要一种方法来处理我的数据并抓取任何看起来像 17 位 VIN 号码的东西并将其返回到该行数据。我正在使用 Python 3,并且是一名新手文本挖掘器,但有一些使用正则表达式的基本经验。

我正在尝试在 python 中创建一个函数,我可以在其中 lambda 将其应用于注释列。

到目前为止的尝试:

C_Notes['VIN#s'] = C_Notes['ClaimsNotes'].str.findall(r'[0-9]{1}[0-9a-zA-Z]{16}') 

我试图在我提供的链接中模仿 VIN 的格式。

所以寻找具有以下品质的字符串的东西:

编辑:更改的代码片段。如果我用虚构的文本制作了一些 VIN 的玩具示例,但我没有成功遍历我的 pandas 列,则此代码示例有效。每个行条目都有一大段文本我希望函数一次遍历每一行。

谢谢你。

4

2 回答 2

1

但是您到底在处理哪个 VIN 系统?

维基百科有描述 17 位 VIN 号码的文章,描述了三种不同的系统:ISO 3779、欧洲和北美。

显然,没有一般的正式规则规定什么(onlyletter/onlydigit/letterordigit)占据哪个位置。

前 3 个字符取决于制造商国家/地区,其中第一个是大洋洲和美洲的数字,但其他所有人都是字母。

对于北美,第 9、13、14、15、16 和 17 位始终为数字,I,O,Q从不使用字母。

考虑到上述考虑,可以使用以下模式:

[0-9][0-9A-Za-z^IiOoQq]{7}[0-9][0-9A-Za-z^IiOoQq]{3}[0-9]{5}

由数字 ( [0-9]) 和字母或数字组成,但不是禁止字符。^inside[]意味着将遵循字符黑名单。

作为更一般的说明,我建议不要根据有限的合法字符串子集猜测正则表达式。

于 2019-05-15T18:42:59.610 回答
0

好吧,您的代码正则表达式不起作用,因为违反了您的具体情况。尝试:

^[0-9][a-zA-Z]{2}[0-9a-zA-Z]{5}[a-zA-Z]{3}[0-9]{6}
于 2019-05-15T17:45:09.050 回答