Το RegEx, ή Κανονική Έκφραση, είναι μια ακολουθία χαρακτήρων που σχηματίζει ένα πρότυπο αναζήτησης.
Το RegEx μπορεί να χρησιμοποιηθεί για να ελέγξει αν μια συμβολοσειρά περιέχει το καθορισμένο πρότυπο αναζήτησης.
Το Python έχει ένα ενσωματωμένο πακέτο που ονομάζεται re, το οποίο μπορεί να χρησιμοποιηθεί για να δουλέψετε με Κανονικές Εκφράσεις.
Εισαγωγή της ενότητας re:
import re
Ο κώδικας θα είναι στα Αγγλικά, καθώς και το περιεχόμενο της print(), ενώ τα υπόλοιπα θα είναι στα Ελληνικά:
import re text = "The string is an example" pattern = "The string" # Χρησιμοποιήστε τη μέθοδο search() για να βρείτε αν το πρότυπο υπάρχει στο κείμενο match = re.search(pattern, text) if match: print("Pattern found in the text!") else: print("Pattern NOT found in the text!")
Σε αυτό το παράδειγμα, χρησιμοποιούμε τη μέθοδο search() της ενότητας re για να ελέγξουμε αν το πρότυπο υπάρχει στη συμβολοσειρά “text”. Εάν το πρότυπο βρεθεί, το πρόγραμμα θα εμφανίσει “Pattern found in the text!”, διαφορετικά θα εμφανίσει “Pattern NOT found in the text!”.
Συναρτήσεις RegEx
Το module re προσφέρει μια σειρά από συναρτήσεις που μας επιτρέπουν να αναζητήσουμε μια συμβολοσειρά για ταίριασμα και παράδειγμα:
- findall() – Επιστρέφει μια λίστα που περιέχει όλα τα ταιριάσματα.
- search() – Επιστρέφει ένα αντικείμενο Match αν βρεθεί ένα ταίριασμα κάπου στη συμβολοσειρά.
- split() – Επιστρέφει μια λίστα όπου η συμβολοσειρά έχει χωριστεί σε κάθε σημείο όπου βρέθηκε το πρότυπο.
- sub() – Αντικαθιστά ένα ή περισσότερα ταιριάσματα με μια συμβολοσειρά.
[adinserter block=”2″]
- findall()
import re text = "The weather today is sunny, and tomorrow will be rainy." pattern = "\\b[a-zA-Z]*day\\b" # Χρησιμοποιήστε την findall() για να βρείτε όλες τις εμφανίσεις του προτύπου matches = re.findall(pattern, text) print("Matches:", matches)
- search()
import re text = "The weather today is sunny, and tomorrow will be rainy." pattern = "\\b[a-zA-Z]*day\\b" # Χρησιμοποιήστε την search() για να βρείτε την πρώτη εμφάνιση του προτύπου match = re.search(pattern, text) if match: print("Match found:", match.group()) else: print("No match found")
- split()
import re text = "The weather today is sunny, and tomorrow will be rainy." pattern = "\\b,\\b" # Χρησιμοποιήστε την split() για να χωρίσετε τη συμβολοσειρά όπου βρέθηκε το πρότυπο split_text = re.split(pattern, text) print("Split text:", split_text)
- sub()
import re text = "The weather today is sunny, and tomorrow will be rainy." pattern = "\\b[a-zA-Z]*day\\b" replacement = "XXX" # Χρησιμοποιήστε την sub() για να αντικαταστήσετε τις εμφανίσεις του προτύπου με τη συμβολοσειρά αντικατάστασης substituted_text = re.sub(pattern, replacement, text) print("Substituted text:", substituted_text)
Κάθε παράδειγμα χρησιμοποιεί την αντίστοιχη συνάρτηση για να επιτελέσει μια διαφορετική εργασία με το πρότυπο και τη συμβολοσειρά.
Ακολουθεί ένας πίνακας με μεταχαρακτήρες και παραδείγματα:
Μεταχαρακτήρας | Περιγραφή | Παράδειγμα Προτύπου | Ταιριάζει με |
---|---|---|---|
. | Οποιοσδήποτε χαρακτήρας | .a | “ba”, “ca”, “da”, … |
^ | Έναρξη της συμβολοσειράς | ^Ηello | “Hello world”, “Hello Python” |
$ | Τέλος της συμβολοσειράς | world$ | “Hello world”, “Beautiful world” |
* | Μηδέν ή περισσότερα επαναλήψεις του προηγούμενου χαρακτήρα | a* | “”, “a”, “aa”, “aaa”, … |
+ | Μία ή περισσότερες επαναλήψεις του προηγούμενου χαρακτήρα | a+ | “a”, “aa”, “aaa”, … |
? | Μηδέν ή μία επανάληψη του προηγούμενου χαρακτήρα | a? | “”, “a” |
{n} | n επαναλήψεις του προηγούμενου χαρακτήρα | a{2} | “aa” |
{n,m} | Από n έως m επαναλήψεις του προηγούμενου χαρακτήρα | a{2,4} | “aa”, “aaa”, “aaaa” |
| | Λειτουργεί ως “ή” για να ταιριάξει με έναν από τους δύο χαρακτήρες | a|b | “a”, “b” |
() | Δημιουργεί μια ομάδα χαρακτήρων | (abc)+ | “abc”, “abcabc”, “abcabcabc” |
\ | Χρησιμοποιείται για να γ |
[adinserter block=”3″]
Συνεχίζοντας με τους μεταχαρακτήρες:
Μεταχαρακτήρας | Περιγραφή | Παράδειγμα Προτύπου | Ταιριάζει με |
---|---|---|---|
\A | Έναρξη του κειμένου | \AHello | “Hello world”, “Hello Python” |
\Z | Τέλος του κειμένου | world\Z | “Hello world”, “Beautiful world” |
\b | Όριο λέξης (κενό, τελεία, κόμμα κλπ.) | \bword\b | “word”, “The word is”, “a word.” |
\B | Μη όριο λέξης | \Bword\B | “words”, “wordplay”, “password” |
\d | Οποιοσδήποτε ψηφίο (0-9) | \d | “0”, “1”, “2”, … |
\D | Οποιοσδήποτε μη ψηφίο | \D | “a”, “b”, “c”, … |
\s | Οποιοσδήποτε κενό χαρακτήρα (space, tab, newline) | \s | ” “, “\t”, “\n” |
\S | Οποιοσδήποτε μη κενό χαρακτήρα | \S | “a”, “b”, “c”, … |
\w | Οποιοσδήποτε λεκτικό χαρακτήρα (a-z, A-Z, 0-9, _) | \w | “a”, “A”, “1”, “_” |
\W | Οποιοσδήποτε μη λεκτικό χαρακτήρα | \W | “!”, “@”, “#”, … |
Μπορείτε να χρησιμοποιήσετε αυτούς τους μεταχαρακτήρες για να δημιουργήσετε πρότυπα που να ταιριάζουν με τις αναγκές σας. Με τη χρήση του re module και των σχετικών συναρτήσεων, μπορείτε να εκτελέσετε αναζήΣυνεχίζοντας με τη χρήση του re module και των συναρτήσεων του, μπορείτε να εκτελέσετε αναζήτηση, αντικατάσταση, διαίρεση ή άλλες λειτουργίες σε συμβολοσειρές με βάση τα καθορισμένα πρότυπα. Ακολουθούν μερικά παραδείγματα:
- Εύρεση όλων των ταιριαστών συμβολοσειρών:
import re text = "Το email του Γιάννη είναι giannis@example.com και του Νίκου nikos@example.org" pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' matches = re.findall(pattern, text) print("Βρέθηκαν τα εξής emails:", matches)
- Αντικατάσταση κειμένου με βάση ένα πρότυπο:
import re text = "Το κόστος είναι 35€ και τα έξοδα αποστολής 5€." pattern = r'(\d+)€' replacement = r'$1 USD' result = re.sub(pattern, replacement, text) print("Το αποτέλεσμα μετά την αντικατάσταση είναι:", result)
- Διαίρεση συμβολοσειράς με βάση ένα πρότυπο:
import re text = "Ο κωδικός πρόσβασης πρέπει να περιέχει: κεφαλαία γράμματα, πεζά γράμματα, αριθμούς και σύμβολα." pattern = r'\W+' words = re.split(pattern, text) print("Η συμβολοσειρά διαχωρίστηκε στα εξής στοιχεία:", words)
Αυτά τα παραδείγματα δείχνουν πώς μπορείτε να χρησιμοποιήσετε το re module και τις συναρτήσεις του για να εκτελέσετε διάφορες εργασίες με συμβολοσειρές, όπως αναζήτηση, αντικατάσταση και διαίρεση, με βάση τα καθορισμένα πρότυπα. Η επιτυχής εφαρμογή των μεταχαρακτήρων και των συναρτήσεων του re module εξαρτάται από την κατανόηση των αναγκών σας και τη δημιουργία των κατάλληλων προτύπων για να ταιριάζουν με το κείμενο που θέλετε να επεξεργαστείτε.
Για να αυξήσετε την ευελιξία του κώδικα σας και να βελτιώσετε την απόδοση, μπορείτε να εξετάσετε τη χρήση των συναρτήσεων re.compile()
και re.finditer()
. Η συνάρτηση re.compile()
σας επιτρέπει να δημιουργήσετε ένα προκαθορισμένο πρότυπο που μπορείτε να χρησιμοποιήσετε αργότερα για πολλαπλές αναζητήσεις, ενώ η συνάρτηση re.finditer()
επιστρέφει έναν επαναληπτέα (iterable) αντικείμενο αντί για μια λίστα, επιτρέποντας σας να περιηγηθείτε στα αποτελέσματα με λιγότερη κατανάλωση μνήμης.
[adinserter block=”4″]
Οι ειδικές ακολουθίες είναι χαρακτήρες που ακολουθούνται από ένα backslash () και έχουν ειδική σημασία. Ακολουθεί ένας πίνακας με τους χαρακτήρες, την περιγραφή τους και παραδείγματα:
Χαρακτήρας | Περιγραφή | Παράδειγμα |
---|---|---|
\A | Έναρξη του κειμένου | \AThe |
\b | Όριο λέξης | \bThe\b |
\B | Μη όριο λέξης | \BThe\B |
\d | Οποιοσδήποτε ψηφίο (0-9) | \d |
\D | Οποιοσδήποτε μη ψηφίο | \D |
\s | Οποιοσδήποτε κενό χαρακτήρας (space, tab, newline) | \s |
\S | Οποιοσδήποτε μη κενό χαρακτήρας | \S |
\w | Οποιοσδήποτε λεκτικό χαρακτήρα (a-z, A-Z, 0-9, _) | \w |
\W | Οποιοσδήποτε μη λεκτικό χαρακτήρα | \W |
\Z | Τέλος του κειμένου | end\Z |
\ | Ένα λεκτικό backslash | \ |
\n | Νέα γραμμή | \n |
\r | Επιστροφή καρέκλας | \r |
\t | Στοίχιση (tab) | \t |
Μπορείτε να χρησιμοποιήσετε αυτές τις ειδικές ακολουθίες για να δημιουργήσετε πιο περίπλοκα πρότυπα που ταιριάζουν με τις απαιτήσεις σας.
Σε συνδυασμό με τους μεταχαρακτήρες που αναφέραμε προηγουμένως, μπορείτε να δημιουργήσετε πιο περίπλοκα πρότυπα για να ανταποκριθείτε στις απαιτήσεις των εργασιών που θέλετε να εκτελέσετε. Ακολουθούν μερικά παραδείγματα που επιδεικνύουν πώς μπορείτε να χρησιμοποιήσετε τις ειδικές ακολουθίες σε πραγματικά προβλήματα:
- Εύρεση όλων των λέξεων που ξεκινούν με ένα κεφαλαίο γράμμα:
import re text = "Η Python είναι μια δημοφιλής γλώσσα προγραμματισμού. Είναι ευέλικτη και ισχυρή." pattern = r'\b[A-ZΑ-Ω][a-zα-ω]*\b' matches = re.findall(pattern, text) print("Λέξεις που ξεκινούν με κεφαλαίο γράμμα:", matches)
- Εύρεση όλων των τηλεφωνικών αριθμών που ακολουθούν το πρότυπο (xxx) xxx-xxxx:
import re text = "Οι αριθμοί τηλεφώνου είναι (123) 456-7890 και (987) 654-3210." pattern = r'\(\d{3}\) \d{3}-\d{4}' matches = re.findall(pattern, text) print("Τηλεφωνικοί αριθμοί:", matches)
- Εύρεση των λέξεων που περιέχουν αριθμούς:
import re
import re text = "Οι κωδικοί πρόσβασης είναι pass1234, secret5678 και admin9012." pattern = r'\b\w*\d\w*\b' matches = re.findall(pattern, text) print("ΛέξΛέξεις που περιέχουν αριθμούς:", matches)
Αυτά τα παραδείγματα αποδεικνύουν τη χρησιμότητα των ειδικών ακολουθιών στη δημιουργία προτύπων που μπορούν να αναγνωρίσουν και να επεξεργαστούν τα αναγκαία κείμενα. Όσο πιο εξοικειωθείτε με τις ειδικές ακολουθίες και τους μεταχαρακτήρες, τόσο πιο αποτελεσματικά θα μπορείτε να χειριστείτε και να επεξεργαστείτε το κείμενο με τη βιβλιοθήκη `re` της Python. Συνεχίζοντας να εξερευνάτε τη βιβλιοθήκη `re` και να εφαρμόζετε τα εργαλεία και τις τεχνικές που προσφέρει, θα αποκτήσετε περισσότερη εμπειρία και ικανότητα στον τομέα της επεξεργασίας κειμένου. Η επιτυχής χρήση των ειδικών ακολουθιών και των συναρτήσεων της βιβλιοθήκης `re` θα σας βοηθήσει να αντιμετωπίσετε ποικίλα προβλήματα κειμένου και να βελτιώσετε την απόδοση των προγραμμάτων σας.
Ένα σύνολο είναι μια ομάδα χαρακτήρων μέσα σε ένα ζεύγος αγκυλών [] με ειδική σημασία:
Σύνολο | Περιγραφή |
---|---|
[arn] | Επιστρέφει έναν από τους χαρακτήρες “a”, “r”, ή “n” |
[a-n] | Επιστρέφει έναν από τους χαρακτήρες μεταξύ “a” και “n” (αλφαβητικά) |
[^arn] | Επιστρέφει οποιονδήποτε χαρακτήρα εκτός από “a”, “r” και “n” |
[+] | Σε αυτήν την περίπτωση, το σύμβολο “+” δεν έχει την κανονική του σημασία. Στη θέση αυτή, αναφέρεται στον ίδιο το χαρακτήρα “+” |
Τα σύνολα χρησιμοποιούνται για να προσδιορίσουν εύρη χαρακτήρων που θέλετε να συμπεριλάβετε ή να εξαιρέσετε από την αναζήτηση. Μπορούν να είναι πολύ χρήσιμα για τη δημιουργία πιο εξειδικευμένων και αποτελεσματικών προτύπων αναζήτησης.