使用Python通过文本挖掘大量的车辆识别号码(VIN#)注释

时间:2019-05-15 17:35:36

标签: python python-3.x pandas text-mining vin

我有2列的大型保险索赔数据集。一栏是索赔标识。另一个是与索赔相关的大量注释。

我的目标是为特定的VIN码发短信给“索赔说明”。 VIN#通常为17位格式。参见下文:https://www.autocheck.com/vehiclehistory/autocheck/en/vinbasics

但是,根据我的数据,出现了一些问题。有时,只有VIN#的最后6位数字被输入。我基本上需要一种方法来处理我的数据并获取任何看起来像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列进行迭代时没有获得任何成功。每行条目都有大段文字,我希望函数一次遍历每行。

谢谢。

2 个答案:

答案 0 :(得分:1)

但是您正在使用哪个VIN系统准确

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

显然,没有通用的正式规则来规定什么(仅字母/仅数字/字母数字)占据哪个位置。

前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])和字母数字组成,但不是禁止的字符。 ^中的[]表示将跟随字符黑名单。

更笼统地说,我建议不要基于有限的合法字符串子集猜测正则表达式。

答案 1 :(得分:0)

好吧,您的代码正则表达式无法正常工作,因为它违反了您的详细信息。尝试:

^[0-9][a-zA-Z]{2}[0-9a-zA-Z]{5}[a-zA-Z]{3}[0-9]{6}