Παύλα εντός συνόλων στις κανονικές εκφράσεις της Python
Η παύλα - είναι επίσης ειδικός χαρακτήρας μέσα στα [ ]
(αλλά έξω - όχι). Εάν χρειάζεστε την ίδια την παύλα ως χαρακτήρα - τότε τοποθετήστε την σε θέση,
όπου δεν θα γίνει αντιληπτή ως διαχωριστής
ομάδας.
Γιατί αυτό είναι σημαντικό: μπορείτε να δημιουργήσετε μια ομάδα
χαρακτήρων, χωρίς να το καταλάβετε. Για παράδειγμα,
έτσι - '[:-@]' - νομίζετε ότι
επιλέγετε την άνω και κάτω τελεία, την παύλα και το at,
αλλά στην πραγματικότητα προκύπτει μια ομάδα χαρακτήρων ανάμεσα
στο : και στο @. Σε αυτήν την ομάδα περιλαμβάνονται
οι ακόλουθοι χαρακτήρες: ? < = > :
Από πού προέρχονται; Από τον πίνακα ASCII - η άνω και κάτω τελεία έχει μικρότερο αριθμό από το at - και προκύπτει ομάδα. Δηλαδή όλες οι ομάδες προκύπτουν βάσει του πίνακα ASCII (αν θέλετε μπορείτε να το χρησιμοποιήσετε αυτό).
Πώς να το αντιμετωπίσετε: τοποθετήστε τον χαρακτήρα
παύλας σε θέση όπου σίγουρα δεν θα γίνει αντιληπτή
ως χαρακτήρας ομάδας, για παράδειγμα, στην αρχή ή
στο τέλος (δηλαδή μετά το [ή πριν
το ]).
Μπορείτε επίσης να δώσετε escape στην παύλα - τότε
θα συμβολίζει τον εαυτό της ανεξάρτητα
από τη θέση. Για παράδειγμα, αντί για [:-@]
να γράψετε [:\-@] - και δεν θα υπάρχει πλέον ομάδα,
αλλά θα υπάρχουν τρεις χαρακτήρες - άνω και κάτω τελεία,
παύλα και at @.
Παράδειγμα
Στο επόμενο παράδειγμα το μοτίβο αναζήτησης είναι:
ψηφίο 1, μετά γράμμα από 'a'
έως 'z', μετά ψηφίο 2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Αποτέλεσμα εκτέλεσης κώδικα:
'! 1-2 ! !'
Παράδειγμα
Ας κάνουμε τώρα escape στην παύλα. Στο
αποτέλεσμα το μοτίβο αναζήτησης είναι: ψηφίο
1, μετά γράμμα 'a', ή
παύλα, ή γράμμα 'z', μετά ψηφίο
2:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Αποτέλεσμα εκτέλεσης κώδικα:
'! ! 1c2 !'
Παράδειγμα
Μπορείτε απλά να μετακινήσετε την παύλα, χωρίς να κάνετε escape σ' αυτήν:
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Αποτέλεσμα εκτέλεσης κώδικα:
'! ! 1c2 !'
Παράδειγμα
Στο επόμενο παράδειγμα το μοτίβο αναζήτησης είναι:
πρώτος χαρακτήρας - είναι μικρά γράμματα ή
παύλα '-', μετά δύο γράμματα
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Αποτέλεσμα εκτέλεσης κώδικα:
'! Axx ! @xx'
Παράδειγμα
Στο επόμενο παράδειγμα το μοτίβο αναζήτησης είναι:
πρώτος χαρακτήρας - είναι μικρά, κεφαλαία
γράμματα ή παύλα '-', μετά δύο γράμματα
'x':
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Αποτέλεσμα εκτέλεσης κώδικα:
'! ! ! @xx'
Παράδειγμα
Μπορείτε να τοποθετήσετε την παύλα ανάμεσα σε δύο ομάδες - εκεί σίγουρα δεν θα δημιουργήσει μια ακόμη ομάδα:
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Αποτέλεσμα εκτέλεσης κώδικα:
'! ! ! @xx'
Πρακτικές Ασκήσεις
Δίνεται η ακόλουθη συμβολοσειρά:
txt = 'xaz xBz xcz x-z x@z'
Βρείτε όλες τις συμβολοσειρές σύμφωνα με το ακόλουθο μοτίβο:
γράμμα 'x', κεφαλαίο ή μικρό
γράμμα ή παύλα, γράμμα 'z'.
Δίνεται η ακόλουθη συμβολοσειρά:
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Βρείτε όλες τις συμβολοσειρές σύμφωνα με το ακόλουθο μοτίβο:
γράμμα 'x', μετά ή δολάριο, ή
παύλα ή συν, μετά γράμμα 'z'.