Coding for KidsCoding for Kids
Δημιουργικά ΕπίπεδαΠροκλήσειςΟδηγός Εκπαιδευτικού
Ψηφίστε για λειτουργίες
Προχωρημένο Μάθημα Ανάπτυξης σε Python
Κεφάλαιο
>
Επίπεδο

Ενότητες Συμβολοσειρών και Χρόνου
Μονάδα Regex

Στόχος

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

Στα παρακείμενα γραφεία υπάρχει κάποια τεκμηρίωση που χρειάζεται ενημέρωση σχετικά με τους υπαλλήλους που θα ξεκινήσουν την εργασία τους στη νέα γεωργική έκταση και τη ζωνοποίηση για το πού θα καλλιεργηθούν οι καλλιέργειες και θα εκτρέφονται τα ζώα. Η διαχείριση των αρχείων μπορεί να είναι αρκετά δύσκολη, ειδικά όταν αντιμετωπίζουμε μεγάλα σώματα κειμένου. Για το σκοπό αυτό θα χρησιμοποιήσουμε το module re, το οποίο είναι σύντμηση για τις Κανονικές Εκφράσεις, επίσης γνωστές ως Regex. Μπορούμε να έχουμε πρόσβαση στις συναρτήσεις του χρησιμοποιώντας import re, για τους σκοπούς αυτού του επιπέδου θα χρησιμοποιήσουμε τις ακόλουθες συναρτήσεις:

  • re.findall(): Επιστρέφει μια λίστα με όλες τις εμφανίσεις ενός χαρακτήρα ή ακολουθίας χαρακτήρων. Δέχεται δύο (2) ορίσματα, το πρώτο είναι οι χαρακτήρες που αναζητάτε μέσα σε ένα κείμενο, το δεύτερο είναι το κείμενο στο οποίο αναζητάτε.
  • re.sub(): Αντικαθιστά μια συγκεκριμένη εμφάνιση με μια άλλη ακολουθία χαρακτήρων. Δέχεται τρία (3) ορίσματα, το πρώτο είναι οι χαρακτήρες που θέλετε να αντικαταστήσετε, το δεύτερο είναι με τι θα ήθελε να τους αντικαταστήσει και το τρίτο είναι το κείμενο στο οποίο αναζητάτε.
  • re.search(): Βρίσκει την τοποθεσία μιας ακολουθίας μέσα σε ένα κείμενο, επιστρέφει ένα αντικείμενο. Δέχεται δύο (2) ορίσματα, τους χαρακτήρες που αναζητάτε και το κείμενο στο οποίο αναζητάτε. Μπορείτε να χρησιμοποιήσετε άλλες συναρτήσεις με το αντικείμενο που επιστρέφει, όπως η span() η οποία επιστρέφει έναν διάνυσμα με τις θέσεις έναρξης και λήξης του αναζητούμενου στοιχείου στο κείμενο.
  • re.split(): Διασπά ένα κείμενο σε λίστα σε καθορισμένα διαστήματα. Δέχεται δύο (2) ορίσματα, το πρώτο καθορίζει το σημείο διαχωρισμού του κειμένου και το δεύτερο είναι το κείμενο που θέλετε να διασπάσετε.
  • re.match(): Ελέγχει εάν ένα κείμενο περιέχει μια συγκεκριμένη τιμή στην αρχή του. Λειτουργεί σαν μια απλουστευμένη έκδοση της re.search() αλλά είναι πιο αποτελεσματική και ελέγχει αν το κείμενο που αναζητάτε έχει το ερώτημα στην αρχή.

Το module re μπορεί επίσης να χρησιμοποιεί ειδικές ακολουθίες, υπάρχουν κωδικοί που μπορείτε να χρησιμοποιήσετε μαζί με τις συναρτήσεις του re και που επιτρέπουν να περιλάβετε διάφορα χαρακτηριστικά του κειμένου. Υπάρχει μια μεγάλη λίστα με ειδικές ακολουθίες, αλλά για αυτό το επίπεδο θα χρησιμοποιήσουμε τις ακόλουθες:

  • \B: Ελέγχει αν οι καθορισμένοι χαρακτήρες βρίσκονται μέσα στο κείμενο αλλά όχι στην αρχή ή στο τέλος μιας λέξης.
  • \D: Επιστρέφει χαρακτήρες που δεν είναι αριθμοί από 0 έως 9

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

Ξεκινήστε πλησιάζοντας στο χρυσό σημάδι X και στραμμένοι προς το τραπέζι με το σημείωμα, χρησιμοποιήστε τη συνάρτηση read() για να ελέγξετε το σημείωμα το οποίο περιέχει ένα κατάλογο όλων των υπαλλήλων. Κάθε όνομα περιέχει το # που διαχωρίζει τον αριθμό του υπαλλήλου, το κείμενο που περιέχει τα ονόματα αποθηκεύεται επίσης σε μια σταθερή μεταβλητή με όνομα manifest.

Δημιουργήστε μια λίστα με όνομα tags και αποθηκεύστε την τιμή της re.findall(), που χρησιμοποιείται για την αναζήτηση όλων των # στην σταθερή μεταβλητή manifest, ως εξής: tags = re.findall("#", manifest). Δημιουργήστε μια μεταβλητή με όνομα number και χρησιμοποιήστε τη συνάρτηση len() με τη λίστα tags για να μετρήσετε πόσα στοιχεία περιέχει η λίστα, κάτι που θα μας ενημερώσει για τον αριθμό των υπαλλήλων στον κατάλογο. Χρησιμοποιήστε τη συνάρτηση speak() με τη μεταβλητή number για να ανακοινώσετε πόσα ονόματα περιέχονται στη λίστα.

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

Οι τρέχουσες εργαζόμενες ομάδες αποθηκεύονται σε μια σταθερή μεταβλητή με όνομα assignments, και πρέπει να ενημερώσουμε αυτό το έγγραφο με τις πληροφορίες της λίστας νέων προσλήψεων. Αντικαταστήστε τα ονόματα που διαφέρουν στη λίστα χρησιμοποιώντας τη συνάρτηση re.sub() για να υποκαταστήσετε ένα μέρος του κειμένου με ένα άλλο. Για παράδειγμα, μία από τις αλλαγές είναι ως εξής:

assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)

Το όνομα "Billy Hodgins" αντικαθίσταται με το "Carol Hopkins" στο έγγραφο. Εκτός από αυτήν την αλλαγή, σαρώστε το έγγραφο και ενημερώστε αυτό και ένα ακόμη όνομα στη λίστα, ώστε να ολοκληρωθεί η ενημέρωση του εγγράφου. Χρησιμοποιήστε τη συνάρτηση write() με το assignments για να επαληθεύσετε τα αποτελέσματα.

Τώρα που φροντίσαμε τους κατάλογους των υπαλλήλων, ήρθε η ώρα να προχωρήσουμε στη ζωνοποίηση της φάρμας. Μετακινηθείτε προς το σκοτεινό σημάδι X πάνω από το κόκκινο χαλί και χρησιμοποιήστε τη συνάρτηση read(), η οποία θα σας δείξει μια λεπτομερή ανασκόπηση της ζωνοποίησης. Αυτές οι πληροφορίες αποθηκεύονται σε μια σταθερή μεταβλητή με όνομα zones.

Είναι ιδιαίτερα σημαντικό να εντοπίσουμε την τοποθεσία του 6210 στο έγγραφο, καθώς η ζώνη χρειάζεται επανεξέταση. Για να το κάνουμε αυτό, πρέπει να χρησιμοποιήσουμε τη συνάρτηση re.search() για να εντοπίσουμε την τοποθεσία του συγκεκριμένου αριθμού τομέα στη ζωνοποίηση. Δημιουργήστε μια μεταβλητή με όνομα index και αποθηκεύστε το αντικείμενο αναζήτησης, θέτοντας την αναζήτηση στο r"6210\B". Αυτό που κάνει είναι το εξής: το r αναζητά το ακατέργαστο κείμενο, το 6210 είναι ο τομέας που αναζητούμε, και το \B είναι το κριτήριο της ειδικής ακολουθίας για την αναζήτηση. Αυτό εκτελείται ως εξής: index = re.search(r"6210\B", zones).

Τώρα που το index περιέχει το αντικείμενο αναζήτησης, ήρθε η ώρα να εξάγουμε δεδομένα από αυτό χρησιμοποιώντας το span(). Δημιουργήστε μια μεταβλητή με όνομα vector και αποθηκεύστε την τοποθεσία του αντικειμένου αναζήτησης, ως εξής: vector = index.span(). Μόλις ρυθμιστεί, χρησιμοποιήστε τη μεταβλητή vector με την προ-γραμμένη write().

Στη συνέχεια, θα εργαστούμε για τον εντοπισμό των στοιχείων ζωνοποίησης. Μετακινηθείτε προς το σκοτεινό σημάδι X πάνω από το πράσινο χαλί. Δημιουργήστε μια λίστα με όνομα sectors και χρησιμοποιήστε τη συνάρτηση re.split() για να συγκεντρώσετε όλους τους διάφορους τομείς ζωνοποίησης σε μια λίστα. Στη συνάρτηση split, χρησιμοποιήστε την ειδική ακολουθία "\D" για να πάρετε μόνο τους αριθμούς από τη μεταβλητή zones. Χρησιμοποιήστε μια list comprehension για να αφαιρέσετε τυχόν κενά από τη λίστα, χρησιμοποιώντας τη συνάρτηση len() για να αφαιρέσετε στοιχεία που είναι πολύ μικρά για να είναι σωστός αριθμός τομέα. Όπως εξής:

sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]

Χρησιμοποιήστε το zones με τις συναρτήσεις write() για να καταγράψετε όλους τους τομείς ζωνοποίησης.

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

Μετακινηθείτε προς το σκοτεινό σημάδι X πάνω από το μωβ χαλί, υπάρχουν τρεις (3) τομείς προτεραιότητας σε μεταβλητές με ονόματα: sector_a, sector_b, sector_c, που έχουν προ-γραμμενεί στους επεξεργαστές κώδικα. Εισάγετε τις τιμές που διαβάσατε στο ανοιχτό σημάδι X. Αυτές οι μεταβλητές χρησιμοποιούν μια list comprehension που περνάει από όλα τα στοιχεία στη λίστα sectors και τα φιλτράρει μέσω της συνάρτησης re.match(). Χρησιμοποιήστε τις μεταβλητές sector_a, sector_b, sector_c και εισάγετε τες στην προ-γραμμένη συνάρτηση write() για να ολοκληρώσετε το επίπεδο.

Βιβλίο Κώδικα