DedSec Project

Κανονικές εκφράσεις και επεξεργασία κειμένου — 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] περιλαμβάνει μόνο βασικά λατινικά. Για κωδικούς με απαιτήσεις ασφαλείας, προτίμησε ακριβή λίστα επιτρεπόμενων χαρακτήρων.

Περιορισμένες ασκήσεις

  1. Αναζήτησε κυριολεκτικά [a+b] και σύγκρινε συμπεριφορά με και χωρίς re.escape. Δοκίμασε ανοικτή αγκύλη για να προκαλέσεις ελεγχόμενο σφάλμα σύνταξης.
  2. Έλεγξε κενό κείμενο, ερώτημα 1.024 χαρακτήρων και ελληνικές λέξεις με τόνους. Όρισε ρητά τι σημαίνει κενή αναζήτηση.
  3. Με πολύ μικρό συνθετικό κείμενο δοκίμασε αμφίσημους εμφωλευμένους ποσοδείκτες. Μη δοκιμάζεις τεράστια είσοδο που μπορεί να καθηλώσει την εφαρμογή· για μη έμπιστα μοτίβα χρειάζεται ασφαλέστερος αναλυτής ή μηχανισμός χρονικών ορίων.
  4. Πρόσθεσε εισαγωγικά και εμφώλευση στα παραδείγματα με αγκύλες. Εξήγησε γιατί απαιτείται δομημένος αναλυτής.

Παραδοτέα: PASS, επτά συγκεκριμένοι έλεγχοι, ασφαλής κυριολεκτική αναζήτηση και διακριτή προχωρημένη λειτουργία κανονικών εκφράσεων.