Παύλα εντός συνόλων στις κανονικές εκφράσεις της Python

Η παύλα - είναι επίσης ειδικός χαρακτήρας μέσα στα [ ] (αλλά έξω - όχι). Εάν χρειάζεστε την ίδια την παύλα ως χαρακτήρα - τότε τοποθετήστε την σε θέση, όπου δεν θα γίνει αντιληπτή ως διαχωριστής ομάδας.

Γιατί αυτό είναι σημαντικό: μπορείτε να δημιουργήσετε μια ομάδα χαρακτήρων, χωρίς να το καταλάβετε. Για παράδειγμα, έτσι - '[:-@]' - νομίζετε ότι επιλέγετε την άνω και κάτω τελεία, την παύλα και το at, αλλά στην πραγματικότητα προκύπτει μια ομάδα χαρακτήρων ανάμεσα στο : και στο @. Σε αυτήν την ομάδα περιλαμβάνονται οι ακόλουθοι χαρακτήρες: ? < = > :

Από πού προέρχονται; Από τον πίνακα ASCII - η άνω και κάτω τελεία έχει μικρότερο αριθμό από το at - και προκύπτει ομάδα. Δηλαδή όλες οι ομάδες προκύπτουν βάσει του πίνακα ASCII (αν θέλετε μπορείτε να το χρησιμοποιήσετε αυτό).

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

Μπορείτε επίσης να δώσετε escape στην παύλα - τότε θα συμβολίζει τον εαυτό της ανεξάρτητα από τη θέση. Για παράδειγμα, αντί για [:-@] να γράψετε [:\-@] - και δεν θα υπάρχει πλέον ομάδα, αλλά θα υπάρχουν τρεις χαρακτήρες - άνω και κάτω τελεία, παύλα και at @.

Παράδειγμα

Στο επόμενο παράδειγμα το μοτίβο αναζήτησης είναι: ψηφίο 1, μετά γράμμα από 'a' έως 'z', μετά ψηφίο 2:

pythontxt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)

print(res)

Αποτέλεσμα εκτέλεσης κώδικα:

python'! 1-2 ! !'

Παράδειγμα

Ας κάνουμε τώρα escape στην παύλα. Στο αποτέλεσμα το μοτίβο αναζήτησης είναι: ψηφίο 1, μετά γράμμα 'a', ή παύλα, ή γράμμα 'z', μετά ψηφίο 2:

pythontxt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)

print(res)

Αποτέλεσμα εκτέλεσης κώδικα:

python'! ! 1c2 !'

Παράδειγμα

Μπορείτε απλά να μετακινήσετε την παύλα, χωρίς να κάνετε escape σ' αυτήν:

pythontxt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)

print(res)

Αποτέλεσμα εκτέλεσης κώδικα:

python'! ! 1c2 !'

Παράδειγμα

Στο επόμενο παράδειγμα το μοτίβο αναζήτησης είναι: πρώτος χαρακτήρας - είναι μικρά γράμματα ή παύλα '-', μετά δύο γράμματα 'x':

pythontxt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)

print(res)

Αποτέλεσμα εκτέλεσης κώδικα:

python'! Axx ! @xx'

Παράδειγμα

Στο επόμενο παράδειγμα το μοτίβο αναζήτησης είναι: πρώτος χαρακτήρας - είναι μικρά, κεφαλαία γράμματα ή παύλα '-', μετά δύο γράμματα 'x':

pythontxt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)

print(res)

Αποτέλεσμα εκτέλεσης κώδικα:

python'! ! ! @xx'

Παράδειγμα

Μπορείτε να τοποθετήσετε την παύλα ανάμεσα σε δύο ομάδες - εκεί σίγουρα δεν θα δημιουργήσει μια ακόμη ομάδα:

pythontxt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)

print(res)

Αποτέλεσμα εκτέλεσης κώδικα:

python'! ! ! @xx'

Πρακτικές Ασκήσεις

Задание 1

Δίνεται η ακόλουθη συμβολοσειρά:

pythontxt = 'xaz xBz xcz x-z x@z'

Βρείτε όλες τις συμβολοσειρές σύμφωνα με το ακόλουθο μοτίβο: γράμμα 'x', κεφαλαίο ή μικρό γράμμα ή παύλα, γράμμα 'z'.

Задание 2

Δίνεται η ακόλουθη συμβολοσειρά:

pythontxt = 'xaz x$z x-z xcz x+z x%z x*z'

Βρείτε όλες τις συμβολοσειρές σύμφωνα με το ακόλουθο μοτίβο: γράμμα 'x', μετά ή δολάριο, ή παύλα ή συν, μετά γράμμα 'z'.