Τεκμηρίωση για την ενότητα Re για Python 3 σε . Re module για κανονικές εκφράσεις

Οι κανονικές εκφράσεις είναι ένα πολύ δημοφιλές στοιχείο σχεδόν κάθε γλώσσας προγραμματισμού. Σας βοηθούν να έχετε γρήγορη πρόσβαση στις πληροφορίες που χρειάζεστε. Συγκεκριμένα, χρησιμοποιούνται όταν είναι απαραίτητη η επεξεργασία κειμένου. Η Python έρχεται με μια ειδική ενότητα από προεπιλογή. re, το οποίο είναι υπεύθυνο για την εργασία με κανονικές εκφράσεις.

Σήμερα θα μιλήσουμε λεπτομερώς για το τι είναι γενικά, πώς να εργαστείτε μαζί τους και πώς η ενότητα re θα βοηθήσει.

Κανονικές εκφράσεις: εισαγωγή

Ποιες είναι οι χρήσεις των κανονικών εκφράσεων; Σχεδόν όλοι. Για παράδειγμα, αυτά:

  1. Εφαρμογές Ιστού που απαιτούν επικύρωση κειμένου. Χαρακτηριστικό παράδειγμα είναι οι διαδικτυακοί πελάτες αλληλογραφίας.
  2. Οποιαδήποτε άλλα έργα που σχετίζονται με κείμενα, βάσεις δεδομένων και ούτω καθεξής.

Πριν ξεκινήσουμε την ανάλυση της σύνταξης, θα πρέπει να κατανοήσουμε λεπτομερέστερα τις βασικές αρχές λειτουργίας της βιβλιοθήκης re και γενικά τι είναι γενικά καλό σε αυτό. Θα δώσουμε και παραδείγματα από την πραγματική πρακτική, όπου θα περιγράψουμε τον μηχανισμό χρήσης τους. Μπορείτε να δημιουργήσετε ένα τέτοιο πρότυπο, κατάλληλο για να εκτελέσετε μια μεγάλη ποικιλία λειτουργιών με κείμενο.

Τι είναι ένα πρότυπο στη βιβλιοθήκη Re;

Με αυτό, μπορείτε να αναζητήσετε πληροφορίες διαφόρων τύπων, να λάβετε πληροφορίες που αντιστοιχούν σε αυτές, προκειμένου να κάνετε άλλες λειτουργίες πιο προσαρμοστικές. Και, φυσικά, να επεξεργαστεί αυτά τα δεδομένα.

Για παράδειγμα, πάρτε το ακόλουθο πρότυπο: s+. Σημαίνει οποιονδήποτε διαστημικό χαρακτήρα. Εάν προσθέσετε ένα σύμβολο συν σε αυτό, τότε αυτό σημαίνει ότι το μοτίβο περιλαμβάνει περισσότερα από ένα κενά. Μπορεί ακόμη και να ταιριάξει χαρακτήρες καρτελών που καλούνται με t+.

Πριν τα χρησιμοποιήσετε, πρέπει να εισαγάγετε τη βιβλιοθήκη Re. Μετά από αυτό, χρησιμοποιούμε μια ειδική εντολή για τη μεταγλώττιση του προτύπου. Αυτό γίνεται σε δύο βήματα.

>>> εισαγωγή ρε

>>> regex = re.compile('s+')

Συγκεκριμένα, αυτός ο κώδικας εκτελεί τη λειτουργία της μεταγλώττισης ενός προτύπου που μπορεί να χρησιμοποιηθεί. για παράδειγμα, για να αναζητήσετε κενά (ένα ή περισσότερα).

Λήψη ξεχωριστών πληροφοριών από διαφορετικές συμβολοσειρές χρησιμοποιώντας κανονικές εκφράσεις

Ας υποθέσουμε ότι έχουμε μια μεταβλητή που περιέχει τις ακόλουθες πληροφορίες.

>>> text = “””100 INF Πληροφορική

213 ΜΑΤ Μαθηματικά  

156 ENG Αγγλικά»»»

Περιλαμβάνει τρία μαθήματα κατάρτισης. Κάθε ένα από αυτά αποτελείται από τρία μέρη - αριθμό, κωδικό και όνομα. Βλέπουμε ότι το διάστημα μεταξύ αυτών των λέξεων είναι διαφορετικό. Τι πρέπει να κάνετε για να χωρίσετε αυτή τη γραμμή σε ξεχωριστούς αριθμούς και λέξεις; Υπάρχουν δύο μέθοδοι για την επίτευξη αυτού του στόχου:

  1. καλέστε μια συνάρτηση εκ νέου διάσπαση.
  2. εφαρμογή της λειτουργίας διαίρεση for ρεγεξ.

Ακολουθεί ένα παράδειγμα χρήσης της σύνταξης καθεμιάς από τις μεθόδους για τη μεταβλητή μας.

>>> re.split('s+', κείμενο)  

# ή

>>> regex.split(κείμενο)

Έξοδος: ['100', 'INF', 'Computer Science', '213', 'MAT', 'Math', '156', 'ENG', 'Αγγλικά']

Γενικά, μπορούν να χρησιμοποιηθούν και οι δύο μέθοδοι. Αλλά στην πραγματικότητα είναι πολύ πιο εύκολο να χρησιμοποιήσετε μια τυπική έκφραση αντί να χρησιμοποιήσετε τη συνάρτηση πολλές φορές. εκ νέου διάσπαση.

Εύρεση αντιστοιχιών με τρεις συναρτήσεις

Ας υποθέσουμε ότι χρειάζεται να εξαγάγουμε μόνο αριθμούς από μια συμβολοσειρά. Τι πρέπει να γίνει για αυτό;

re.findall()

Εδώ είναι μια περίπτωση χρήσης για τη λειτουργία findall(), το οποίο, μαζί με κανονικές εκφράσεις, σας επιτρέπει να εξαγάγετε εμφανίσεις ενός ή περισσότερων αριθμών από μια μεταβλητή κειμένου.

>>> εκτύπωση (κείμενο)  

100 INF Πληροφορική

213 ΜΑΤ Μαθηματικά  

156 ENG Αγγλικά

>>> regex_num = re.compile('d+')  

>>> regex_num.findall(κείμενο)  

['100', '213', '156']

Μαζί με το σύμβολο d, χρησιμοποιήσαμε ένα πρότυπο που υποδεικνύει απολύτως οποιαδήποτε αριθμητική τιμή βρίσκεται σε μια μεταβλητή ή κείμενο. Και αφού προσθέσαμε ένα + εκεί, αυτό σημαίνει ότι πρέπει να υπάρχει τουλάχιστον ένας αριθμός. 

Μπορείτε επίσης να χρησιμοποιήσετε το σύμβολο * για να καθορίσετε ότι η παρουσία ενός ψηφίου δεν απαιτείται για να βρεθεί μια αντιστοιχία.

Αλλά στην περίπτωσή μας, αφού χρησιμοποιήσαμε +, εξάγαμε με findall() 1 ή περισσότεροι ψηφιακοί προσδιορισμοί μαθημάτων από το κείμενο. Έτσι, στην περίπτωσή μας, οι κανονικές εκφράσεις λειτουργούν ως ρυθμίσεις για τη συνάρτηση.

re.search() vs re.match()

Όπως μπορείτε να μαντέψετε από το όνομα των συναρτήσεων, οι πρώτες αναζητούν μια αντιστοιχία στο κείμενο. Ερώτηση: Ποια είναι η διαφορά μεταξύ βρείτε όλα; Το θέμα είναι ότι επιστρέφει ένα συγκεκριμένο αντικείμενο που ταιριάζει με το μοτίβο και όχι ολόκληρη τη σειρά των αποτελεσμάτων που βρέθηκαν με τη μορφή λίστας, όπως η προηγούμενη συνάρτηση.

Με τη σειρά του, η λειτουργία re.match κάνει το ίδιο. Μόνο η σύνταξη είναι διαφορετική. Το πρότυπο πρέπει να τοποθετηθεί στην αρχή. 

Ας πάρουμε ένα παράδειγμα που το αποδεικνύει αυτό.

>>> # δημιουργήστε μια μεταβλητή με κείμενο

>>> text2 = «»»INF Πληροφορική

213 ΜΑΤ Μαθηματικά 156″»»  

>>> # μεταγλωττίστε regex και αναζητήστε μοτίβα

>>> regex_num = re.compile('d+')  

>>> s = regex_num.search(text2)  

>>> print('Πρώτο ευρετήριο: ', s.start())  

>>> print('Τελευταίο ευρετήριο: ', s.end())  

>>> print(text2[s.start():s.end()]) 

Πρώτος δείκτης: 17 

Τελευταίος δείκτης: 20

213

Εάν θέλετε να έχετε ένα παρόμοιο αποτέλεσμα με διαφορετικό τρόπο, μπορείτε να χρησιμοποιήσετε τη συνάρτηση ομάδα().

Αντικατάσταση μέρους του κειμένου με τη βιβλιοθήκη Re

Για να αντικαταστήσετε κείμενο, χρησιμοποιήστε τη συνάρτηση re.sub(). Ας υποθέσουμε ότι η λίστα των μαθημάτων μας έχει αλλάξει λίγο. Βλέπουμε ότι μετά από κάθε ψηφιακή τιμή έχουμε μια καρτέλα. Το καθήκον μας είναι να συνδυάσουμε όλη αυτή τη σειρά σε μια γραμμή. Για να γίνει αυτό, πρέπει να αντικαταστήσουμε την έκφραση s+ να περάσω 

Το αρχικό κείμενο ήταν:

# δημιουργήστε μια μεταβλητή με κείμενο

>>> text = “””100 INF t Πληροφορική

213 ΜΑΤ τ Μαθ  

156 ENG t Αγγλικά»»»  

>>> εκτύπωση (κείμενο)  

100 ΠΛΗΡΟΦΟΡΙΕΣ Επιστήμη των υπολογιστών

213 ΜΑΤ Μαθηματικά  

156 ENG Αγγλικά

Για να εκτελέσουμε την επιθυμητή λειτουργία, χρησιμοποιήσαμε τις ακόλουθες γραμμές κώδικα.

# αντικαταστήστε ένα ή περισσότερα κενά με 1

>>> regex = re.compile('s+')  

>>> print(regex.sub(' ', κείμενο))  

Ως αποτέλεσμα, έχουμε μία γραμμή. 

101 COM Computers 205 MAT Mathematics 189 ENG Αγγλικά

Τώρα σκεφτείτε ένα άλλο πρόβλημα. Δεν είμαστε αντιμέτωποι με το καθήκον να βάζουμε χώρους. Είναι πολύ πιο σημαντικό για εμάς όλα τα ονόματα μαθημάτων να ξεκινούν από μια νέα γραμμή. Για να γίνει αυτό, χρησιμοποιείται μια άλλη έκφραση που προσθέτει μια νέα γραμμή στην εξαίρεση. Τι είδους έκφραση είναι αυτή;

Βιβλιοθήκη Re υποστηρίζει μια δυνατότητα όπως αρνητική αντιστοίχιση. Διαφέρει από το άμεσο στο ότι περιέχει ένα θαυμαστικό πριν από την κάθετο. Δηλαδή, αν πρέπει να παραλείψουμε τον χαρακτήρα νέας γραμμής, τότε πρέπει να γράψουμε !n αντί για n.

Παίρνουμε τον παρακάτω κωδικό.

# καταργήστε όλα τα κενά εκτός από τη νέα γραμμή  

>>> regex = re.compile('((?!n)s+)')  

>>> print(regex.sub(' ', κείμενο))  

100 INF Πληροφορική

213 ΜΑΤ Μαθηματικά  

156 ENG Αγγλικά

Τι είναι οι ομάδες κανονικής έκφρασης;

Με τη βοήθεια ομάδων κανονικών εκφράσεων, μπορούμε να πάρουμε τα επιθυμητά αντικείμενα με τη μορφή ξεχωριστών στοιχείων και όχι σε μία γραμμή. 

Ας υποθέσουμε ότι πρέπει να πάρουμε τον αριθμό, τον κωδικό και το όνομα του μαθήματος όχι σε μία γραμμή, αλλά ως ξεχωριστά στοιχεία. Για να ολοκληρώσετε την εργασία, θα χρειαστεί να γράψετε έναν τεράστιο αριθμό περιττών γραμμών κώδικα. 

Στην πραγματικότητα, η εργασία μπορεί να απλοποιηθεί πολύ. Μπορείτε να μεταγλωττίσετε το πρότυπο για όλες τις καταχωρήσεις και απλώς να καθορίσετε τα δεδομένα που πρέπει να λάβετε από τις αγκύλες.

Θα υπάρχει πολύ μικρός αριθμός γραμμών. 

# Δημιουργήστε ομάδες προτύπων κειμένου μαθημάτων και εξάγετε τα

>>> course_pattern = '([0-9]+)s*([A-ZY]{3})s*([a-zA-ZoY]{4,})'  

>>> re.findall(course_pattern, text)  

[('100', 'INF', 'Computer Science'), ('213', 'MAT', 'Math'), ('156', 'ENG', 'Αγγλικά')]

Η έννοια της «άπληστης» αντιστοίχισης

Βασικά, οι κανονικές εκφράσεις προγραμματίζονται για να εξάγουν το μέγιστο ποσό δεδομένων που ταιριάζουν. Και ακόμα κι αν χρειάζεστε πολύ λιγότερα.

Ας δούμε ένα δείγμα κώδικα HTML όπου πρέπει να λάβουμε την ετικέτα.

>>> κείμενο = "Παράδειγμα αντιστοίχισης άπληστων κανονικών εκφράσεων"  

>>> re.findall('', κείμενο)  

['Παράδειγμα αντιστοίχισης άπληστων κανονικών εκφράσεων']

Αντί να εξάγει μόνο μία ετικέτα, η Python πήρε ολόκληρη τη συμβολοσειρά. Γι' αυτό λέγεται άπληστος.

Και τι να κάνετε για να πάρετε μόνο την ετικέτα; Σε αυτή την περίπτωση, πρέπει να χρησιμοποιήσετε lazy matching. Για να καθορίσετε μια τέτοια έκφραση, προστίθεται ένα ερωτηματικό στο τέλος του μοτίβου.

Θα λάβετε τον ακόλουθο κώδικα και την έξοδο του διερμηνέα.

>>> re.findall('', κείμενο)  

[”, ”]

Εάν απαιτείται να ληφθεί μόνο η πρώτη εμφάνιση, τότε χρησιμοποιείται η μέθοδος Αναζήτηση ().

re.search('', text).group()  

"

Τότε θα βρεθεί μόνο η ετικέτα ανοίγματος.

Δημοφιλή πρότυπα έκφρασης

Ακολουθεί ένας πίνακας που περιέχει τα πιο συχνά χρησιμοποιούμενα μοτίβα κανονικών εκφράσεων.

Τεκμηρίωση για την ενότητα Re για Python 3 σε . Re module για κανονικές εκφράσεις

Συμπέρασμα

Εξετάσαμε μόνο τις πιο βασικές μεθόδους εργασίας με κανονικές εκφράσεις. Σε κάθε περίπτωση, έχετε δει πόσο σημαντικά είναι. Και εδώ δεν έχει καμία διαφορά αν είναι απαραίτητο να αναλύσουμε ολόκληρο το κείμενο ή μεμονωμένα αποσπάσματα του, αν είναι απαραίτητο να αναλύσουμε μια ανάρτηση σε ένα κοινωνικό δίκτυο ή να συλλέξουμε δεδομένα για να το επεξεργαστούμε αργότερα. Οι τακτικές εκφράσεις είναι ένας αξιόπιστος βοηθός σε αυτό το θέμα.

Σας επιτρέπουν να εκτελείτε εργασίες όπως:

  1. Καθορισμός της μορφής των δεδομένων, όπως μια διεύθυνση email ή ένας αριθμός τηλεφώνου.
  2. Λήψη μιας χορδής και χωρισμός της σε πολλές μικρότερες χορδές.
  3. Εκτελέστε διάφορες λειτουργίες με κείμενο, όπως αναζήτηση, εξαγωγή των απαραίτητων πληροφοριών ή αντικατάσταση μέρους των χαρακτήρων.

Οι κανονικές εκφράσεις σάς επιτρέπουν επίσης να εκτελείτε μη τετριμμένες λειτουργίες. Με την πρώτη ματιά, δεν είναι εύκολο να κατακτήσεις αυτή την επιστήμη. Αλλά στην πράξη, όλα είναι τυποποιημένα, επομένως αρκεί να το καταλάβετε μία φορά, μετά την οποία αυτό το εργαλείο μπορεί να χρησιμοποιηθεί όχι μόνο στην Python, αλλά και σε οποιαδήποτε άλλη γλώσσα προγραμματισμού. Ακόμη και το Excel χρησιμοποιεί τυπικές εκφράσεις για την αυτοματοποίηση της επεξεργασίας δεδομένων. Άρα είναι αμαρτία να μην χρησιμοποιείς αυτό το εργαλείο.

Αφήστε μια απάντηση