Κανονικές εκφράσεις και επεξεργασία κειμένου — DedSec Project
Κανονικές εκφράσεις — κυριολεκτική αναζήτηση και όρια Unicode Σκοπός και κίνδυνοι Ένα πεδίο αναζήτησης σε τοπική βιβλιοθήκη πρέπει κανονικά να αντιμετωπίζει το κείμενο του χρήστη ως…
Κανονικές εκφράσεις — κυριολεκτική αναζήτηση και όρια Unicode
Σκοπός και κίνδυνοι
Ένα πεδίο αναζήτησης σε τοπική βιβλιοθήκη πρέπει κανονικά να αντιμετωπίζει το κείμενο του χρήστη ως κυριολεκτική ακολουθία χαρακτήρων. Ο χρήστης μπορεί να γράψει a+b, [note] ή άλλα σημεία στίξης που έχουν ειδική σημασία σε κανονικές εκφράσεις. Αν περάσει απευθείας το κείμενο στη re.compile, η αναζήτηση μπορεί να αλλάξει νόημα ή να αποτύχει. Η re.escape δημιουργεί κυριολεκτικό μοτίβο. Αν προσφέρεις ξεχωριστή λειτουργία κανονικών εκφράσεων, όρισε μέγιστο μήκος και φρόντισε να μην εξετάζονται τεράστιες μη έμπιστες συμβολοσειρές με αμφίσημους εμφωλευμένους ποσοδείκτες.
Εκτελέσιμο παράδειγμα Python 3
Αποθήκευσε ως regex_lab.py και εκτέλεσε python3 regex_lab.py. Ελέγχει την ασφαλή διαφυγή χαρακτήρων, τη διαφορά πλήρους και μερικής αντιστοίχισης, την άπληστη αναζήτηση και την κάλυψη ελληνικών γραμμάτων.
import re
needle = "a+b"
assert re.search(re.escape(needle), "code a+b end").group() == "a+b"
assert re.findall(r"<.*>", "<a><b>") == ["<a><b>"]
assert re.findall(r"<.*?>", "<a><b>") == ["<a>","<b>"]
assert re.fullmatch(r"[0-9]{4}", "2026")
assert not re.fullmatch(r"[0-9]{4}", "x2026")
assert re.fullmatch(r"\w+", "Αθήνα")
assert not re.fullmatch(r"[A-Za-z]+", "Αθήνα")
print("PASS: literal escaping, greedy vs lazy, Unicode")
Ερμηνεία αποτελεσμάτων
Η re.search αρκείται σε αντιστοίχιση υποσυμβολοσειράς, ενώ η re.fullmatch απαιτεί αντιστοίχιση ολόκληρης της εισόδου. Το <.> είναι άπληστο και ενώνει δύο τμήματα με αγκύλες, ενώ το <.?> σταματά στο κοντινότερο κατάλληλο σημείο. Κανένα από τα δύο δεν είναι πλήρης αναλυτής HTML: μπορούν να υπάρξουν εμφωλεύσεις, εισαγωγικά ή μη έγκυρα στοιχεία. Η κατηγορία \w της Python υποστηρίζει χαρακτήρες Unicode, όπως ελληνικά γράμματα, ενώ το [A-Za-z] περιλαμβάνει μόνο βασικά λατινικά. Για κωδικούς με απαιτήσεις ασφαλείας, προτίμησε ακριβή λίστα επιτρεπόμενων χαρακτήρων.
Περιορισμένες ασκήσεις
- Αναζήτησε κυριολεκτικά [a+b] και σύγκρινε συμπεριφορά με και χωρίς re.escape. Δοκίμασε ανοικτή αγκύλη για να προκαλέσεις ελεγχόμενο σφάλμα σύνταξης.
- Έλεγξε κενό κείμενο, ερώτημα 1.024 χαρακτήρων και ελληνικές λέξεις με τόνους. Όρισε ρητά τι σημαίνει κενή αναζήτηση.
- Με πολύ μικρό συνθετικό κείμενο δοκίμασε αμφίσημους εμφωλευμένους ποσοδείκτες. Μη δοκιμάζεις τεράστια είσοδο που μπορεί να καθηλώσει την εφαρμογή· για μη έμπιστα μοτίβα χρειάζεται ασφαλέστερος αναλυτής ή μηχανισμός χρονικών ορίων.
- Πρόσθεσε εισαγωγικά και εμφώλευση στα παραδείγματα με αγκύλες. Εξήγησε γιατί απαιτείται δομημένος αναλυτής.
Παραδοτέα: PASS, επτά συγκεκριμένοι έλεγχοι, ασφαλής κυριολεκτική αναζήτηση και διακριτή προχωρημένη λειτουργία κανονικών εκφράσεων.