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

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

Δημοσ.

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

 

Θέλω να τσεκάρω αν το 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"
 

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

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

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

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

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

Σύνδεση

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

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