முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 8 · பாடம் 4 இன் 4பாடத்திட்டத்தில் 32/36~12 min
தொகுதி பாடங்கள் (4/4)

மறு தொகுதி: பைத்தானில் regex

re தொகுதி பைத்தானில் வழக்கமான வெளிப்பாடுகளை வெளிப்படுத்துகிறது. நீங்கள் ஏற்கனவே எடுத்திருந்தால் இந்த தளத்தில் உள்ள Regex பாடத்திட்டத்தில், நீங்கள் அனைத்து தொடரியல் நன்கு அறிந்திருப்பீர்கள்; இங்கே நாங்கள் APIகளைப் பார்க்கிறோம்.

மூல சரம்: r"..."

ரெஜெக்ஸ்கள் பல பின்சாய்வுகளைப் பயன்படுத்துகின்றன (\d, \b, \s). எப்போதும் அவற்றை இவ்வாறு எழுதுங்கள் ** மூல சரங்கள்** எனவே நீங்கள் அவற்றை இரட்டிப்பாக்க வேண்டியதில்லை:

Python
import re
# raw: \d is a single token
pattern = r"\d+"
# NOT raw: you would have to write "\\d+" otherwise Python interprets \d as "d"

re.search: முதல் நிகழ்வைக் கண்டறியவும்

Python
import re
m = re.search(r"\d+", "ho 42 mele e 17 pere")
m.group()    # '42'
m.start()    # 3
m.end()      # 5

கண்டுபிடிக்கப்பட்டால் Match பொருளை வழங்கும், இல்லையெனில் None. மொழியியல் முறை:

Python
if m := re.search(r"\d+", testo):
    print(m.group())

re.match: சரத்தின் தொடக்கத்தில் மட்டும்

Python
re.match(r"\d+", "42 anni")     # match!
re.match(r"\d+", "ho 42 anni")  # None (doesn't start with a digit)

எங்கும் தேட re.search ஐ விரும்பவும்.

re.findall: அனைத்து நிகழ்வுகளும்

Python
re.findall(r"\d+", "ho 42 mele, 17 pere, 3 banane")
# ['42', '17', '3']

பேட்டர்னில் கேப்சர் குழுக்கள் இருந்தால், findall குழுக்களை வழங்கும், இல்லை முழு போட்டி:

Python
re.findall(r"(\w+)@(\w+)", "ada@x bob@y")
# [('ada', 'x'), ('bob', 'y')]

re.sub: மாற்று

Python
re.sub(r"\d+", "###", "ho 42 mele e 17 pere")
# 'ho ### mele e ### pere'

இது ஒரு மாற்று செயல்பாட்டுடனும் செயல்படுகிறது (இது போட்டியைப் பெறுகிறது):

Python
re.sub(r"\d+", lambda m: str(int(m.group()) * 2), "ho 42 mele")
# 'ho 84 mele'

பெயரிடப்பட்ட குழுக்கள்

Python
m = re.search(r"(?P<anno>\d{4})-(?P<mese>\d{2})-(?P<giorno>\d{2})", "2025-01-15")
m.group("anno")    # '2025'
m.groupdict()      # {'anno': '2025', 'mese': '01', 'giorno': '15'}

பயனுள்ள கொடிகள்

Python
re.search(r"ciao", "CIAO", re.IGNORECASE)       # case-insensitive
re.findall(r"^.+$", testo, re.MULTILINE)        # ^/$ match every line
re.search(r"a.b", "a\nb", re.DOTALL)            # . matches newline too

நினைவக பாதுகாப்பிற்கான re.finditer

நீங்கள் ஒரு பெரிய உரைத் தொகுதியில் பொருத்தங்களைச் செயலாக்க வேண்டும் என்றால், re.findall பிரித்தெடுக்கப்பட்ட அனைத்து மேட்ச் சரங்களையும் உள்ளடக்கிய நினைவகத்தில் ஒரு பட்டியலை ஒதுக்குகிறது. re.finditer() ஐப் பயன்படுத்துவது விரும்பத்தக்கது, இது மேட்ச் பொருள்களின் சோம்பேறி மறு செய்கையை அளிக்கிறது, குறைந்தபட்ச நினைவகத்தை உட்கொள்ளும்.

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#python.m8.l4.e1
முயற்சிகள்: 0ஏற்றுகிறது…

`text = 'ordine #123, totale €45.50, ricevuta #456'` என வழங்கப்பட்டு, அனைத்து வரிசை எண்களையும் (#க்குப் பின் உள்ள இலக்கங்கள்) சரங்களின் பட்டியலாக `ஆர்டர்களில்` பிரித்தெடுக்கவும். `ஆர்டர்களை` மதிப்பிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

re.findall(r"#(\\d+)", text) — இலக்கங்களுக்கு மட்டும் குழுவைப் பிடிக்கவும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

மதிப்பாய்வு பயிற்சி

உடற்பயிற்சி#python.m8.l4.e2
முயற்சிகள்: 0ஏற்றுகிறது…

`s = 'தொலைபேசி: 06-12345678 e tel: 02-9876'` வழங்கப்பட்டுள்ளது, எல்லா தொலைபேசி எண்களையும் (வடிவமைப்பு \\d+-\\d+) 'XXX' என்ற சரத்துடன் மாற்றி, `முகமூடி` என்பதற்கு ஒதுக்கவும். `முகமூடி` என்பதை மதிப்பிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

re.sub(r"\\d+-\\d+", "XXX", s)

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

கூடுதல் சவால்

உடற்பயிற்சி#python.m8.l4.e3
முயற்சிகள்: 0ஏற்றுகிறது…

\`re\` தொகுதியை இறக்குமதி செய்யவும். \`log_line = "15ms இல் 404 பிழை"\` என்ற சரத்திலிருந்து ஒன்று அல்லது அதற்கு மேற்பட்ட இலக்கங்களைக் கொண்ட அனைத்து எண்களையும் பிரித்தெடுக்கவும். பட்டியலை \`எண்களில்\` சேமித்து மதிப்பிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

அனைத்து எண்களையும் சரங்களின் பட்டியலாக பிரித்தெடுக்க re.findall(r'\\d+', log_line) ஐப் பயன்படுத்தவும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்