Προς το περιεχόμενο

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


Dark_Sage

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

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

 

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

 

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

 

accepted: aabbccccaaaabb

accepted: bbacccbbaa

reject: xxaaaarr

 

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

 

thanks!!



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

 

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

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

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

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

Πχ:

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

 

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

 

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

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

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

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

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

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

re.match('^[abc]*', string)
Επεξ/σία από Ilias95
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θες να έχει και τα τρία γράμματα; Ή δέχεσαι και το "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
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Moderators

Αυτό που προτείνει ο 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"
 
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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