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

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

Δημοσ.


# Ένα μικρό tutorial / παράδειγμα για regular expressions (regex) στην python
# Regex είναι ένας τρόπος για να βρίσκουμε χρήσιμες για εμάς
# πληροφορίες σε αρχεία ή κείμενα πέρα από τις μεθόδους που μας παρέχει η γλώσσα
# προγραμματισμού που χρησιμοποιούμε.
# Αυτό γίνεται δημιουργώντας ένα pattern (πατέντα) της πληροφορίας που θέλουμε
# με την χρήση regex

# Για τις ανάγκες του tutorial θα χρησιμοποιήσω το αρχείο που έχω χρησιμοποιήσει στο topic
# Χρήση urllib.request της python παράδειγμα
# προσθέτοντας στο τέλος τη γραμμή:
# Το email μου είναι [email protected] και το τηλέφωνό μου 0030-06507896541 μπλα μπλα μπλα.

# Οι πληροφορίες που θα πάρω είναι το email το τηλέφωνο και τα σχόλια.

# Αρχικά εισάγω την βιβλιοθήκη της python για regex
import re

# Ανοίγω το αρχείο που έχει τις πληροφορίες που αναζητώ
file = open(r'c:\python34\training\urllib_request2.pyw', encoding='utf-8')

# και το διαβάζω
data=file.read()

# Θα δημιουργήσω τρία regex objects ένα για κάθε πληροφορία που θέλω

# EMAIL
# παρατηρώ πως είναι γραμμένο το email '[email protected]' και προσπαθώ
# να δημιουργήσω μία πατέντα (pattern) γι αυτό.
# Είναι κάποιοι χαρακτήρες όχι κενοί 1ς ή περισσότεροι ακολουθεί το σύμβολο @
# και μετά πάλι χαρακτήρες μέχρι να φτάσουμε σε κενό.
# Αυτό είναι το pattern
# θα προσπαθήσω να το αποδώσω με regex
# Βρίσκω ότι το '\S' αντιστοιχεί σε οποιδήποτε μή κενό χαρακτήρα
# για μία η περισσότερες φορές βλέπω ότι χρησιμοποιώ το '+' μετά το @
# δεν είναι special character και το χρησιμοποιώ ώς έχει) και μετά πάλι \S+
# To pattern μου είναι '\S+@\S+'

# Τέλος κάνω στο pattern compile για να γίνει object και να μπορώ να το χρησιμοποιήσω
email_regex=re.compile(r'\S+@\S+')

# Τηλέφωνο
# Το pattern του τηλεφώνου βλέπω ότι είναι 4ψηφία μετά - και μετά 11 ψηφία
# Αν κοιτάξω στην καρτέλα βλέπω ότι unicode αριθμό μπορώ να αντιστοιχίσω με το '\d'
# οπότε μπορώ να γράψω '\d\d\d\d-\d\d\d\d\d\d\d\d\d\d\d' η παύλα δέν είναι κάτι special
# και την χρησιμοποιούμαι ώς έχει. Αν το χρησιμοποιήσω ώς έχει θα δουλέψει μπορώ όμως
# να χρησιμοποιήσω το {m} που βλέπω ότι αντιστοιχεί στον αριθμό των επαναλήψεων του
# προήγουμενου χαρακτήρα. Γράφω λοιπών το pattern ξανά '\d{4}-\d{11}'
# Εναλλακτικά και για να είμαι ακόμα πιο σωστός μπορώ να γράψω '[0-9]{4}-[0-9]{11}'
# Πατεντάρει μόνο τους αριμούς 0-9 και όχι οποιονδήποτε unicode αριθμό

# Το κάνω compile
tel_regex=re.compile(r'[0-9]{4}-[0-9]{11}')

# Σχόλια
# Βλέπω ότι τα σχόλια ξεκινάν με #
# περιέχουν οποιοδήποτε χαρακτήρα και τελειώνουν στο τέλος της γραμμής
# Το pattern λοιπόν ξεκινά από '#' μετά οποιοσδήποτε χαρακτήρας που αντιστοιχεί
# στην τελεία '.' 0 ή περισσότερες φορές αντιστοιχεί στο '*' το κάνω μη greedy
# με '?' και τελειώνει με το χαρακτήρα πριν την νέα γραμμή που είναι το '$'
# Το pattern δηλαδή για τα σχόλια είναι '#.*?$'

# Το κάνω compile
comment_regex=re.compile(r'#.*?$', re.MULTILINE)
# Το re.MULTILINE είναι ένα flag που μας λέει ότι τα δεδομένα θα διαβάζονται ως πολλές
# γραμμές κάτι που αλλάζει τη συμπεριφορά του '$' από το να δείχνει το τέλος του
# κειμένου στο να δείχνει το τέλος κάθε γραμμής

# Επειτα βρίσκω τo match του email
email=email_regex.search(data)

# To match του τηλεφώνου
tel=tel_regex.search(data)

# και παίρνω σε λίστα όλα τα σχόλια
comments=comment_regex.findall(data)

# Για να δώ τι έκανα
print(email)

print(tel)

for line in comments:
print(line)

# κλείνω το άρχειο
file.close()

# Ίσως φαίνεται λίγο μεγάλο αν αφαιρέσουμε όμως τα σχόλια και χωρίς το
# print βλέπουμε ότι είναι ακριβώς 10 γραμμές κώδικα
# Χωρίς τη χρήση regex σε οποιαδήποτε γλώσσα θα ήταν πολλαπλάσιες.

 

  • Like 2
Δημοσ.

Μπράβο για τα python tutorials που γράφεις. :-)

 

Θα ήθελα να ασχοληθώ παραπάνω με την python αλλά δεν με βοηθάει αρκετά το ότι κάνω (βασικά έκανα) μόνος μου.

Κυρίως θέλω να φτιάχνω editor σε video games (console, όχι pc games) αλλά πρέπει να μάθω πως να χρησιμοποιώ και τα offsets από το save file.

 

Βρήκα πρόσφατα το Python Succinctly και φαίνεται αρκετά ωραίο pdf, πριν 2 καλοκαίρια είχα κάνει μόνος μου για κάνα μήνα python.

Είχα διαβάσει τα a byte of python και τον οδηγό από την TASPython αλλά τα παράτησα τελικά. Μάλλον θα συνεχίσω κάποια στιγμή.

Δημοσ.

Μπράβο για τα python tutorials που γράφεις. :-)

 

Θα ήθελα να ασχοληθώ παραπάνω με την python αλλά δεν με βοηθάει αρκετά το ότι κάνω (βασικά έκανα) μόνος μου.

Κυρίως θέλω να φτιάχνω editor σε video games (console, όχι pc games) αλλά πρέπει να μάθω πως να χρησιμοποιώ και τα offsets από το save file.

 

Βρήκα πρόσφατα το Python Succinctly και φαίνεται αρκετά ωραίο pdf, πριν 2 καλοκαίρια είχα κάνει μόνος μου για κάνα μήνα python.

Είχα διαβάσει τα a byte of python και τον οδηγό από την TASPython αλλά τα παράτησα τελικά. Μάλλον θα συνεχίσω κάποια στιγμή.

Ευχαριστώ Grim Ripper 

Εγώ ασχολούμαι λίγο καιρό τώρα θα είναι κανά 3-4 μήνες (απ όταν παράτησα τη javascript :ph34r: )

Όταν μαθαίνω κάτι ενδιαφέρον που νομίζω ότι αξίζει το ποστάρω.   

Δημοσ.

Ωραίος.

Μόνος υποθέτω μαθαίνεις και σου είναι κάπως εύκολη λόγο του ότι έκανε javascript.

 

Είχα κάνει πρώτα python μόνος μου και όταν ξεκίνησα σε ΙΕΚ του ΟΕΑΔ για τεχνικός υπολογιστών κάναμε C στο 2ο εξάμηνο και στο τρίτο Pascal. Μέχρι και λίγο assembly σε 8086 κάναμε στο 2ο εξάμηνο.

Τώρα σε τι ακριβώς θα μας βοηθήσουν δεν ξέρω, μιας και κανείς μας δεν πήγε γι' αυτό το λόγο αλλά τουλάχιστον είναι μια γνώση και αυτό.

Δημοσ.

Mπορώ να πω ότι ειναι αρκετά απλούστερο απο τα αντίστοιχα regular expressions σε flex-bison (2 χρόνια εφιαλτης) , αν και οι γνώσεις μου σε python είναι σχεδον μηδαμινες.

Δημοσ.

1. Η λέξη πατέντα μπορεί να αλλαχθεί με τη λέξη μοτίβο.

2. Αν είχαμε Δέκα τηλέφωνα, πώς θα παίρναμε το επόμενο; Υπάρχει δρομέας, που απλά εδώ δεν χρησιμοποιήθηκε, ή έχουμε κατανάλωση του data (δηλαδή, ό,τι βγάζουμε να αφαιρείται), ιδού η απορία.

Δημοσ.

Δεν έχω φτιάξει τέτοιο αντικείμενο στην Μ2000. Τώρα το βλέπω για πρώτη φορά.

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

1. Η λέξη πατέντα μπορεί να αλλαχθεί με τη λέξη μοτίβο.

2. Αν είχαμε Δέκα τηλέφωνα, πώς θα παίρναμε το επόμενο; Υπάρχει δρομέας, που απλά εδώ δεν χρησιμοποιήθηκε, ή έχουμε κατανάλωση του data (δηλαδή, ό,τι βγάζουμε να αφαιρείται), ιδού η απορία.

Βασικά δεν κατάλαβα τι ακριβώς ρωτάς

 

Αν έχουμε πολλά στοιχεία έστω τηλέφωνα tel που έχουν το ίδιο pattern κάνουμε ότι στα commends του tutorial .findall() αντί .search() αν έχουμε και διαφορετικά patterns μπορούμε να βάλουμε και το OR '|'. στο compile. tel_regex = re.compile(r'pat1 | pat2 | pat3') κλπ

Το .findall() θα μας μας επιστρέψει μια λίστα με όλα τα στοιχεία μας με τη σειρά που είναι στο κείμενο.

Σε python το tel[0] θα είναι το 1ο και το tel[len(tel)-1] το τελευταίο. 

Επεξ/σία από k33theod
Δημοσ.

Είναι απλό: Αν έχω τηλέφωνα και ονόματα με findall μπορώ να γεμίσω δυο λίστες μια για τα τηλέφωνα και μια για τα ονόματα, ακόμα και αν στο data έχω σε σειρά τηλέφωνο, όνομα.....τηλέφωνοΝ, όνομαΝ

Αυτή είναι η ερώτηση!

Στη προηγούμενη ρώταγα αν έχουμε cursor...όπως σε database, ώστε με μετακίνηση τύπου Seek να πάμε την αναζήτηση (search) του regex εκεί που θέλουμε!

 

(cursor=δρομέας)

Δημοσ.

k33theod.

 

Έχεις ελλείψεις στο θεωρητικό μέρος. regex είναι πολλά παραπάνω από ένα "εργαλείο". Τέλος, το pattern δεν είναι "πατέντα" (!!!) αλλά πρότυπο.

Δημοσ.

Μ2000 

Εξαρτάται πως είναι η πληροφορία στο κείμενο  και πως θέλουμε να την λάβουμε εμείς.

Μπορούμε να πάρουμε δύο λίστες ή μία λίστα που κάθε στοιχείο της έχει δύο πληροφορίες μέσα σε παρένθεση [(onoma1, tilefono1),(onoma2, tilefono2) κλπ] list of tuples λέγεται στην python, αν ενοείς αυτό.  

 

To search  μπορεί να πάρει παράμετρο από που να αρχίζει και που να τελείωνει το ψάξιμο .search(data,0,100) όπως και το .findall

 

Αν θες μπορείς να στείλεις ένα κείμενο και κάνω ένα tutorial ακόμα (θα είναι για μένα εξάσκηση)

 

groot

Ok

Δημοσ.

Οκ, άρα είναι ενδιαφέρον αντικείμενο!

Το compile στάδιο γιατί χρειάζεται; Δεν αρκεί η παράμετρος που δίνεις, το μοτίβο που λέω το Pattern, ή πρότυπο που το λέει ο Groot;

Δημοσ.

Το compile δεν χρειάζεται απαραίτητα. Μπορείς να καλέσεις την search βάζοντας το pattern ως παράμετρο, Δηλαδή re.search(pattern,string). Εγώ προτιμώ όμως τον τρόπο με το compiled pattern δηλαδή compiled_pattern=re.compile(pattern)

και μετά compiled_pattern.search(string).  Όταν έχεις λίγο πολύπλοκo pattern γίνεται μακαρόνι. πχ r'((\d{3}|\(\d{3}\))?(\s|-|\.)?\d{3}(\s|-|\.)\d{4}(\s*(ext|x|ext.)\s*\d{2,5})?)') , Κανονικά και το compile το κάνεις σε πολλές γραμμές αναλύοντας με comment κάθε κομμάτι.

Φαντάσου να το βάλεις αυτό παράμετρο στη re.search() και μετά να έχεις και το string και μετά ίσως και flags Δεν θα καταλαβαίνεις τίποτα.

Δημοσ.

Αυτό που δίνει όπως το καταλαβαίνω είναι ένα επιμέρους αντικείμενο, και μπορείς να βγάλεις και άλλα. Πάντως αν κατάλαβα, θα παίζει για όλα τα data το κάθε επιμέρους compile αντικείμενο.

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

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

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

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

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

Σύνδεση

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

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