Dark_Sage Δημοσ. 10 Σεπτεμβρίου 2013 Δημοσ. 10 Σεπτεμβρίου 2013 Γεια σε όλους, Θέλω να τσεκάρω αν το input μου αποτελείται από 3 συγκεκριμένα γράμματα ανεξαρτήτως συνδυασμού. π.χ εγώ δέχομαι μόνο τα a,b,c accepted: aabbccccaaaabb accepted: bbacccbbaa reject: xxaaaarr έχει κανείς καμία ιδέα επειδή έχω σπάσει το κεφάλι μου? thanks!! EDIT: τελικά έκανα αυτό re.match("^a*b*c*$", mystring) νομίζω δουλεύει δεκτές διορθώσεις!
Moderators Praetorian Δημοσ. 10 Σεπτεμβρίου 2013 Moderators Δημοσ. 10 Σεπτεμβρίου 2013 Διευκρινιστικές ερωτήσεις: 1. θέλεις ένα υποσύνολο αυτών (αλλά μόνο το υποσύνολο) ή και τα 3 γράμματα (στα δύο παραδείγματα έχεις όλα τα γράμματα)? Πχ: Είναι δεκτό το "aaaaabbbb"? To "aaaaaa" ? 2. Τα αντίστοιχα κεφαλαία σε ενδιαφέρουν; ("AAAABBCCC" ή "AAAaaabbbc") 3. Επίσης θέλεις match με το κενό string? Σε ενδιαφέρει να έχεις blanks/white spaces ανάμεσα στις λέξεις, υποθέτεις ότι δεν θα έχεις ή απορρίπτεις εκείνα τα string? Πχ: ειναι δεκτό το "aaa abbbbb cccc" ?
Ilias95 Δημοσ. 10 Σεπτεμβρίου 2013 Δημοσ. 10 Σεπτεμβρίου 2013 (επεξεργασμένο) Αυτό που έγραψες δεν δουλεύει. Πχ. >>> bool(re.match('^a*b*c*$', 'aabbccccbbbbca')) False >>> Ουσιαστικά εσύ προσπαθείς να ταιριάξεις πρώτα τον χαρακτήρα a 0 ή περισσότερες φορές, μετά τον χαρακτήρα b και τέλος τον c. Το σωστό είναι: re.match('^[abc]*', string) Επεξ/σία 11 Σεπτεμβρίου 2013 από Ilias95
pmav99 Δημοσ. 11 Σεπτεμβρίου 2013 Δημοσ. 11 Σεπτεμβρίου 2013 Θες να έχει και τα τρία γράμματα; Ή δέχεσαι και το "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! 3
Moderators Praetorian Δημοσ. 11 Σεπτεμβρίου 2013 Moderators Δημοσ. 11 Σεπτεμβρίου 2013 Αυτό που προτείνει ο 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"
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα