suggestions for VIN parsing
Vincent Davis
vincent at vincentdavis.net
Sun Dec 28 18:27:20 EST 2014
On Fri, Dec 26, 2014 at 12:15 PM, Denis McMahon <denismfmcmahon at gmail.com>
wrote:
> Note, I think the 1981 model year ran KCA - DCA prefixes, not as shown on
> the website you quoted.
>
Denis,
Regarding the KCA - DCA prefixes, do you have a source as to why you think
this?
Here is what I have so far with a simple test at the end. I don't show is a
dict which contains more information about the year/model, its not
relivant. I am happy with how it is working, I hope to be able to decode
BSA, and other British or more generally vintage motorcycle frame and
engine numbers. BSA looks like a mess.
def vin_to_year2(vin):
vin = vin.lower()
alpha_digit_alpha = re.match(r'^(\D+)(\d+)(\D+)$', vin)
digit_alpha = re.match(r'^(\d+)(\D+)$', vin)
alpha_digit = re.match(r'^(\D+)+(\d+)$', vin)
alpha = re.match(r'^(\d+)$', vin)
if alpha_digit_alpha:
alpha_digit_alpha.groups()
elif digit_alpha:
g = digit_alpha.groups()
if 100<=int(g[0]) and g[-1]=='n': # Triumph 1950: From
100N
return 't1950'
elif 101<=int(g[0])<=15808 and g[-1]=='na': # Triumph 1951: 101NA
- 15808NA
return 't1951'
elif 15809<=int(g[0])<=25000 and g[-1]=='na': # Triumph 1952:
15809NA - 25000NA, see also alpha only vin for 1952
# Triumph 1952: 15809NA - 25000NA
return 't1952'
else:
return None
elif alpha_digit:
g = alpha_digit.groups()
if g[0] == 'h' and 101 <= int(g[1]) <= 760: # tu1957: H101 -
H760
return 'tu1957'
elif g[0] == 'h' and 761 <= int(g[1]) <= 5484: # tu1958: H761 -
H5484
return 'tu1958'
elif g[0] == 'h' and 5485 <= int(g[1]) <= 11511: # tu1959: H5485 -
H11511
return 'tu1959'
elif g[0] == 'h' and 11512 <= int(g[1]) <= 18611: # tu1960: H11512
- H18611
return 'tu1960'
elif g[0] == 'h' and 18612 <= int(g[1]) <= 25251: # tu1961: H18612
- H25251
return 'tu1961'
elif g[0] == 'h' and 25252 <= int(g[1]) <= 29732: # tu1962: H25252
- H29732
return 'tu1962'
elif g[0] == 'h' and 29733 <= int(g[1]) <= 32464: # tu1963: H29733
- H32464
return 'tu1963'
elif g[0] == 'h' and 32465 <= int(g[1]) <= 35986: # tu1964: H32465
- H35986
return 'tu1964'
elif g[0] == 'h' and 35987 <= int(g[1]) <= 40527: # tu1965: H35987
- H40527
return 'tu1965'
elif g[0] == 'h' and 40528 <= int(g[1]) <= 49832: # tu1966: H40528
- H49832
return 'tu1966'
elif g[0] == 'h' and 49833 <= int(g[1]) <= 57082: # tu1967: H49833
- H57082
return 'tu1967'
elif g[0] == 'h' and 57083 <= int(g[1]) <= 65572: # tu1968: H57083
- H65572
return 'tu1968'
elif g[0] == 'h' and 65573 <= int(g[1]) <= 67331: # tu1969: H65573
- H67331
return 'tu1969'
elif g[0] == 'd' and 101 <= int(g[1]) <= 7726: # tp1960: D101 -
D7726
return 'tp1960'
elif g[0] == 'd' and 7727 <= int(g[1]) <= 15788: # tp1961: D7727 -
D15788
return 'tp1961'
elif g[0] == 'd' and 15789 <= int(g[1]): # tp1962: D15789 - onward
return 'tp1962'
elif g[0] == 'du' and 101 <= int(g[1]) <= 5824: # 650 t65u1963:
DU101 - DU5824
return 't65u1963'
elif g[0] == 'du' and 5825 <= int(g[1]) <= 13374: # 650 t65u1964:
DU5825 - DU13374
return 't65u1964'
elif g[0] == 'du' and 5825 <= int(g[1]) <= 13374: # 650 t65u1965:
DU5825 - DU13374
return 't65u1965'
elif g[0] == 'du' and 24875 <= int(g[1]) <= 44393: # 650 t65u1966:
DU24875 - DU44393
return 't65u1966'
elif g[0] == 'du' and 44394 <= int(g[1]) <= 66245: # 650 t65u1967:
DU44394 - DU66245
return 't65u1967'
elif g[0] == 'du' and 66246 <= int(g[1]) <= 85903: # 650 t65u1968:
DU66246 - DU85903
return 't65u1968'
elif g[0] == 'du' and 85904 <= int(g[1]) <= 90282: # 650 t65u1969:
DU85904 - DU90282
return 't65u1969'
else:
return None
elif alpha:
g = alpha.groups()
if 25000 <= int(g[0]) <= 32302: # t1952: 25000 - 32302
return 't1952'
elif 32303 <= int(g[0]) <= 44134: # t1953: 32303 - 44134
return 't1953'
elif 44135 <= int(g[0]) <= 56699: # t1954: 44135 - 56699
return 't1954'
elif 56700 <= int(g[0]) <= 70929: # t1955: 56700 - 70929
return 't1955'
elif 70930 <= int(g[0]) <= 82799: # t1956: 70930 - 82799
return 't1956'
elif 100 <= int(g[0]) <= 944 and g[0][0]=='0': # t1956: 0100 - 0944
return 't1956'
elif g[0][0] == '0' and 945 <= int(g[0]) <= 11115: # tp1957: 0945 -
011115
return 'tp1957'
elif g[0][0] == '0' and 11116 <= int(g[0]) <= 20075: # tp1958:
011116 - 020075
return 'tp1958'
elif g[0][0] == '0' and 20076 <= int(g[0]) <= 29363: # tp1959:
020076 - 029363
return 'tp1959'
elif g[0][0] == '0' and 29364 <= int(g[0]) <= 30424: # tp1960:
029364 - 030424
return 'tp1960'
else:
return None
else:
return None
vin_test_list = ['101n', '500n', '234na', '15809NA', '25000', '32303',
'44135', '56700', '70930', '0100', 'H11512', 'D15789', 'DU101']
for vin in vin_test_list:
print(vin_to_year2(vin))
Vincent Davis
720-301-3003
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20141228/c33ccf3b/attachment.html>
More information about the Python-list
mailing list