இதற்கு முன்பு, தொலைபேசி எண்கள், அலைபேசி எண்கள் ஆகியவற்றை எப்படிச் சோதிப்பது என்று பார்த்துவிட்டோம். இப்போது நம் முன்னால் உள்ள கேள்வி – ஒரு தேதி – சரியான தேதி என்று தான் பைத்தான் ரிஜெக்ஸ் மூலம் எப்படி உறுதிப்படுத்துவது என்பதைத் தான்! தேதியை எப்படி எழுதுவோம் – பொதுவாக நாள்/மாதம்/ஆண்டு என்பதை, dd/mm/yyyy எனும் பொது வடிவத்தில் எழுதுவோம் அல்லவா! அதாவது முதலில் இரண்டு எண்கள்(தேதிக்கு), பிறகு இரண்டு எண்கள்(மாதத்திற்கு), பிறகு நான்கு எண்கள்(ஆண்டுக்கு) என்பது புரிகிறது அல்லவா! இதை எப்படி ரிஜெக்ஸ் மூலம் எழுதுவது?
import re
datePattern = re.compile(r'(\d){2}/(\d){2}/\d{4}’)
\d என்பது எண்ணைக் குறிக்கும் என்பதும் {2} என்பது எத்தனை எண்கள் என்பதைக் குறிக்கும் என்பதெல்லாம் இந்தத் தொடரைத் தொடர்ந்து வரும் உங்களுக்குத் தெரிந்தது தான்! இப்போது தேதி, மாதம், ஆண்டு என்று ஒவ்வொன்றாகப் பார்ப்போமா!
தேதி: 1இல் இருந்து 31 வரை இருக்கலாம். அதாவது, தேதிக்குரிய இரண்டு இலக்கங்களில் முதல் இலக்கத்தில் 0,1,2,3 ஆகிய எண்களும் இரண்டாவது இலக்கத்தில் 0இல் இருந்து 9 வரை வரலாம். இதை எப்படி எழுதுவது? [0-3][0-9] சரிதானே!
மாதம்: 1இல் இருந்து 12 வரை இருக்கலாம். அதாவது, முதல் இலக்கம் 0 அல்லது 1, இரண்டாவது இலக்கம் 0 முதல் 9 வரை. இதை எப்படி எழுதுவது – [0-1][0-9] என்று எழுதி விடலாம்.
ஆண்டு: நான்கு எண்கள் – நேரடியாகவே (\d){4} என்று எழுதிவிடலாம்.
இந்த மூன்றையும் சேர்த்து எழுதினால்,
datePattern = re.compile(r'([0-3][0-9])/([0-1][0-9])/((\d){4})’) என்று எழுதி விடலாம். இதன் பிறகான பகுதிகள், முன்பு நாம் எழுதியது போலவே, நாம் கொடுக்கும் வாக்கியத்தில் தேதி இருக்கிறதா என்று தேடி (search) விடலாம்.
dateFound = datePattern.search(‘My birthdate is 28/02/1985’) இப்போது இந்தத் தேதியை அச்சிட்டுப் பார்க்க,
print(dateFound.groups()) என்று கொடுத்து விடலாம்.
இப்போது தான், அடுத்த சிக்கல் தொடங்குகிறது. என்ன சிக்கல் என்கிறீர்களா? தேதியைப் பொத்தாம் பொதுவாக, 31 வரை வரும் என்று சொல்லி விட முடியாதே! சில மாதங்களில் 30 நாட்கள் இருக்கும், சில மாதங்களில் 31 நாட்கள் இருக்கும், பிப்ரவரியில் 28 நாட்களும் இருக்கலாம், 29 நாட்களும் இருக்கலாம். அப்படியானால் ஒரு தேதி, சரியான தேதியா என்று பார்க்க, மாதம் என்ன என்று தெரிய வேண்டும். பிப்ரவரியில் 29 நாட்கள் இருக்க, ஆண்டு என்ன என்று தெரியவேண்டும் அல்லவா? அப்படியானால் இப்போது என்ன செய்யலாம்? நம்மிடம் மொத்தமாகத் தேதி/மாதம்/ஆண்டு இருக்கிறது. இதை உடைத்து, தேதியைத் தனியாக எடுக்க வேண்டும். அதை மாதத்தின் எண்ணுடன் ஒப்பிட வேண்டும். மாதத்துடன் ஒப்பிடும்போது இரண்டாவது மாதமாக (பிப்ரவரியாக) இருந்தால், ஆண்டு – லீப் ஆண்டா இல்லையா என்பதை உறுதிப்படுத்த வேண்டும்.
எப்படிச் செய்வது?
மாதங்கள் 1, 3, 5, 7, 8, 10, 12 எண்களில் இருந்தால் 31ஆம் நாள் வரை வரலாம். 31க்கு மேல் இருக்கக்கூடாது.
if int(month) in [1,3,5,7,8,10,12]:
if int(day)>31:
print(“Invalid Date, please check”)
மாதங்கள் 4, 6, 9, 11 எண்களில் இருந்தால் 30ஆம் நாள் வரை வரலாம். 30க்கு மேல் இருக்கக்கூடாது.
elif int(month) in [4,6,9,11]:
if int(day)>30:
print(“Invalid Date, please check”)
மாதம் 2 என்று இருந்தால், நாள் 28 வரை வரலாம். 29 என்று வந்தால், ஆண்டு லீப்பாண்டா எனப் பார்க்க வேண்டும்.
else:
if int(day)>29:
print(“Invalid Date, please check”)
elif int(day)==29:
y = int(year)
if not (((y%4)==0) and ((y%100)==0) and ((y%400)==0)):
print(“Invalid Date, please check”)
இந்த மூன்று வரிகளையும் சேர்த்து எழுதினால், நம்முடைய வேலை முடிந்தது. செய்வோமா!
நிரல்:
import re datePattern = re.compile(r'([0-3][0-9])/([0-1][0-2])/((\d){4})') dateFound = datePattern.search('My birthdate is 31/09/2000') if not dateFound is None: print(dateFound.groups()) day = dateFound.group(1) month = dateFound.group(2).strip("0") # strip என்ன செய்யும் என்று கொஞ்சம் சிந்தியுங்களேன். year = dateFound.group(3) print(day, month, year) if int(month) in [1,3,5,7,8,10,12]: if int(day)>31: print("Invalid Date, Date can't be greater than 31") elif int(month) in [4,6,9,11]: if int(day)>30: print("Invalid Date, Date can't be greater than 30") else: if int(day)>29: print("Invalid Date, Date can't be greater than 29") elif int(day)==29: y = int(year) if not (((y%4)==0) and ((y%100)==0) and ((y%400)==0)): print("Invalid Date, Date can't be greater than 28") else: print("Invalid Date")
இந்த நிரல் உங்களுக்குப் புரிந்திருக்கும் என்று நம்புகிறேன். இன்னும் அடுத்த பதிவில் வேறு சில ரிஜெக்ஸ் நிரல்கள் பார்க்கலாம்.
– கி. முத்துராமலிங்கம் (muthu@payilagam.com)