我有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列进行迭代时没有获得任何成功。每行条目都有大段文字,我希望函数一次遍历每行。
谢谢。
答案 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}