Προς το περιεχόμενο
  • 0
Συνδεθείτε  
Dark_Sage

Python και regular expression ερώτηση

Ερώτηση

Γεια σε όλους,

 

Θέλω να τσεκάρω αν το input μου αποτελείται από 3 συγκεκριμένα γράμματα ανεξαρτήτως συνδυασμού.

 

π.χ εγώ δέχομαι μόνο τα a,b,c

 

accepted: aabbccccaaaabb

accepted: bbacccbbaa

reject: xxaaaarr

 

έχει κανείς καμία ιδέα επειδή έχω σπάσει το κεφάλι μου?

 

thanks!!



EDIT: τελικά έκανα αυτό re.match("^a*b*c*$", mystring)

 

νομίζω δουλεύει

 

δεκτές διορθώσεις!

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

5 απαντήσεις σε αυτή την ερώτηση

Προτεινόμενες αναρτήσεις

  • 0

Διευκρινιστικές ερωτήσεις:

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

Πχ:

Είναι δεκτό το "aaaaabbbb"? To "aaaaaa" ? 

 

2. Τα αντίστοιχα κεφαλαία σε ενδιαφέρουν; ("AAAABBCCC" ή "AAAaaabbbc")

 

3. Επίσης θέλεις match με το κενό string? Σε ενδιαφέρει να έχεις blanks/white spaces ανάμεσα στις λέξεις, υποθέτεις ότι δεν θα έχεις ή απορρίπτεις εκείνα τα string?

Πχ: ειναι δεκτό το "aaa abbbbb cccc" ?

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0
Δημοσ. (επεξεργασμένο)

Αυτό που έγραψες δεν δουλεύει. Πχ.

>>> bool(re.match('^a*b*c*$', 'aabbccccbbbbca'))
False
>>>

Ουσιαστικά εσύ προσπαθείς να ταιριάξεις πρώτα τον χαρακτήρα a 0 ή περισσότερες φορές, μετά τον χαρακτήρα b και τέλος τον c.
 

Το σωστό είναι:

re.match('^[abc]*', string)
Επεξ/σία από Ilias95

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Θες να έχει και τα τρία γράμματα; Ή δέχεσαι και το "aaaa"? To κενό string?

 

Γράψε tests

import re

pattern = re.compile(r"^[abc]+$")

accepted_tests = ["aaaa", "aabbcc", "a", "b", "c", "cab"]

rejected_tests = ["", "xa", "xb", "cabx"]

if not all([pattern.match(test) for test in accepted_tests]):
    raise Exception("Problem with accepted")

if any([pattern.match(test) for test in rejected_tests]):
    raise Exception("Problem with rejected")

Αν θες να δέχεται και το κενό string

r"^[abc]*$"

αν όχι

r"^[abc]+$"

 

Αυτό που έγραψες δεν δουλεύει. Πχ.

>>> re.match('^a*b*c*$', 'aabbccccbbbbca') == True
False

 

Ναι αλλα και το test που εγραψες εσυ ειναι λαθος. Η match δεν επιστρεφει True/False. Επιστρεφει ειτε match object ειτε None. Στην προκειμενη περιπτωση, οντως επιστρεφει None. Άρα το False που παίρνεις είναι λόγω της σύγκρισης του None με το True. Αλλά και match object να επέστρεφε πάλι False θα σου έδινε. Για να δουλέψει το test θα έπρεπε να κάνεις

bool(re.match('^a*b*c*', 'aabbccccbbbbca')) == True

ps. Αυτός ο editor του Insomnia, δεν σταμάταει να σε εντυπωσιάζει ποτέ. Τώρα έφαγε και ένα single quote σε αντιγραφή κειμένου μέσα από τον editor!

  • Like 3

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Αυτό που προτείνει ο pmav99 πρέπει να είναι ok για τον TS. 

Για κάτι πιο πολύπλοκο (να είναι case insensitive, και να δέχεται κενά πριν και μετά), εγώ δοκίμασα με το

r"^[abc\s]*[abc]+[abc\s]*$"
Και για να δέχεται και το κενό

r"^[abc\s]*[abc]*[abc\s]*$"
και re.IGNORECASE flag

 

import re

myReFlags = 0
myReFlags |= re.IGNORECASE
keystr = r"^[abc\s]*[abc]+[abc\s]*$"
candidateStringList =  ["aabbccccaaaabb", "bbacccbbaa", "xxaaaarr" ,"", "AAAr", " aaa accc"]
for strTmp in candidateStringList:
    if(re.match(keystr, strTmp, flags=myReFlags)) <> None:
        print strTmp +": Accepted"
    else:
        print strTmp +": Rejected"
 

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε έναν λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι εύκολο!

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
Συνδεθείτε  
×
×
  • Δημιουργία νέου...

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.