Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι
  • Σελίδα:
  • 1
  • 2

ΘΕΜΑ: Θέμα με την re και dictionary

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4522

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
Προσπαθώ χρησιμοποιώντας την re να πάρω ολα τα κλειδιά ενός λεξικού που έχουν κάπου αυτό που θα πληκτρολογήσω αλλά δεν δουλεύει δεν αποθηκεύει τιποτα στην w

anazitisi = input("Δωσε 3 Χαρακτήρες για να ψάξω")

pattern = '.*'+anazitisi+'.*'
for a in arxes.keys():
w = re.findall(pattern, a, re.I)

Τι κάνω λάθος
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από nickpsal.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4523

  • embryo
  • Το Άβαταρ του/της embryo
  • Αποσυνδεμένος
  • pyth__
  • Δημοσιεύσεις: 92
  • Ληφθείσες Ευχαριστίες 31
Δεν χρειάζεσαι regex για αυτό.
Γίνεται και έτσι:
anazitisi = input("Δώσε 3 Χαρακτήρες για να ψάξω: ")
ok_keys = []
for a in arxes.keys():
    if '{}'.format(anazitisi) in a:
        ok_keys.append(a)

Επίσης μπορείς να το κάνεις και με list comprehension:
anazitisi = input("Δώσε 3 Χαρακτήρες για να ψάξω: ")
ok_keys = [i for i in arxes.keys() if '{}'.format(anazitisi) in i]

Υ.Γ. Προσπάθησε να χρησιμοποιείς τα "Code tags" όταν βάζεις κώδικα για να είναι πιο ευανάγνωστος και να κρατάει τα σωστά κενά, γιατί στην python είναι πολύ σημαντικά...
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": nickpsal

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4524

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
Ευχαριστω και συγνώμη για τα tags ολο τα ξεχνάω ;)
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από nickpsal.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4525

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Γειά και από μένα
Η χρήση της . είναι λάθος
Αν κάνεις search με '.*' θα σταματήσει στο τέλος της γραμμής
εσύ θές να έχει μπροστά χαρακτήρα '\w*' ή και μετά
επίσης όπως το κάνεις
κάνεις μια λίστα για κάθε find σε κάθε key

Kάνε τα keys ένα text και μετά findall
>>> import re
έστω
arxes={'kati':4,'pati':2,'ola':5}
Αν τα keys δεν έχουν κένα μπορείς να κάνεις
>>> keys=' '.join(arxes.keys())
>>> keys
'kati pati ola'
Τώρα μπορείς να χρησιμοποιήσεις την findall
έστω θες ότι key έχει at
>>> re.findall('\w*at\w*', keys)
['kati', 'pati']

www.regular-expressions.info/tutorial.html

Εναλλακτικά ότι είπε ο embryo

Σε κάθε περίπτωση επείδή η re είναι μικρή βιβλίοθηκη και η κατανόηση των regex για απλή χρήση θέμα 2-3 ωρών διάβασμα πιστεύω ότι αξίζει τον χρόνο και τον κόπο
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": nickpsal

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4527

  • Αποστόλης
  • Το Άβαταρ του/της Αποστόλης
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 148
  • Ληφθείσες Ευχαριστίες 24
Κάτι επίσης απλό με λίγο διαφορετική προσέγγιση:
import re
 
arxes = "quick brown fox jumps over the lazy dog"
i = 0
 
while(i < 3):
	anazitisi = input("Δωσε χαρακτήρα για να ψάξω:\t")
	for chInputChar in re.finditer(anazitisi, arxes):
		print('Ο χαρακτήρας ' + anazitisi + ' βρέθηκε στη θέση' , chInputChar.start() )
	i += 1
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από Αποστόλης.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": nickpsal

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4528

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
Παιδια σας ευχαριστω πολυ δουλεψαν μια χαρα και ολοι οι κωδικες !!!!
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4529

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
2η απορία πάλι για την regex Την Χρησιμοποίησα για να εξάγω Μέρα Ημερομηνία και ώρα από ένα αρχείο. Όλα καλά αλλά είναι στην μορφή "ΗΜΕΡΑ, 15/06/2017 00:00:00" Μπορούμε να το σπάσουμε για να βάλουμε την μέρα σε μια μεταβλητή και την ημερομηνία χωρίς την ώρα σε άλλη???
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από nickpsal.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4530

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Δες στα regex τα groups:
γίνονται με παρενθέσεις
"ΗΜΕΡΑ, 15/06/2017 00:00:00"
 
pattern='(pattern για ημέρα), (pattern gia ημερομηνία) pattern gia ora'
αφού πάρεις το match object
mera, imerominia=match_object.groups()
 
Αν δεν το καταφέρεις δώσε τον κώδικά σου για περισσότερες λεπτομέρειες
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4532

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
Η ημεερομηνια είναι μέσα σε tag και την βγάζω με αυτο.
export_date = re.findall(r"<lastBuildDate>(.*?)</lastBuildDate>",rss, re.I)
Το θέμα μετα είναι οτι θέλω να την χωρισω σε μέρα ημερομηνια και να φυγει η ωρα
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από nickpsal.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4533

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Έχεις
pattern=r"<lastBuildDate>(.*?)</lastBuildDate>"

Θα πρέπει να το αλλάξεις

Ίσως αυτό δουλέψει
pattern=r"<lastBuildDate>(\w+)? (\d{2}/\d{2}/\d{2,4})? .*?</lastBuildDate>"
 
>>> text=" Hello dates date1 <lastBuildDate>Δευτέρα, 12/06/2017 12:00:00  </lastBuildDate> kai date2 <lastBuildDate>Τετάρτη, 15/06/2018 12:25:00  </lastBuildDate> μπλα μπλα@"
>>> p=re.compile(pattern)
 
>>> results=p.findall(text)
>>> results
[('Δευτέρα', '12/06/2017'), ('Τετάρτη', '15/06/2018')]
>>> 
>>> for imera, imerominia in results:
	print(imera ,imerominia)
 
 
Δευτέρα 12/06/2017
Τετάρτη 15/06/2018

Πρέπει να διαβάσεις λίγο μόνος σου και να κατανοήσεις πως δουλεύει.
Αν ρωτάς μόνο δεν θα το καταλάβεις ποτέ.
Ρώτα μόνο τι δεν μπορείς να καταλάβεις από αυτά που δίαβασες
Αλλιώς δεν θα μπορέσεις να λύσεις μόνος σου κανένα πρόβλημα
Φιλικά.

Νομίζω κάπου έχω κάνει ένα μικρό tutorial για τα regex Αν το βρώ θα το ανεβάσω κάπου και θα το αναρτήσω εδώ
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": nickpsal

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4534

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
Θεος!!!!!!!!!!! Ευχαιρστω πολυ δεν έχεις άδικο γι αυτα που είπες απλά τώρα μαθαίνω και εγω python ;)
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4535

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Δυστηχώς το tutorial που είχα κάνει για τα regex είναι πιο πολύ σημειώσεις για μένα και δεν είναι κατάλληλο για διάβασμα

Έκανα ένα καινούργιο ξεκίνημα tutorial στα ελληνικά θα βάλω μερικές έννοιές ακόμα και πιστεύω ότι είναι εντάξει για κάποιον που κάνει αρχή με τα regex
είναι συμπυκνωμένη ύλη από το www.regular-expressions.info/tutorial.html
Regular Expression (regex) είναι ένας τρόπος για να περιγράψουμε κάποιο τμήμα ενός κειμένου.
Ο τρόπος που το κάνουμε είναι με τη δημιουργία patterns
 
Για τα patterns χρησιμοποιούμαι διάφορα σύμβολα χαρακτήρες και έννοιες. Από εδώ και στο εξής θα
χρησιμοποιήσω patterns που λειτουργούν σωστά με το module re στην python.
Αναλόγως το pattern μπορεί με μικρές ή καθόλου αλλαγές να χρησιμοποιηθεί και σε άλλες γλώσσες.
 
Στην πιό απλή μορφή του το pattern περιέχει μόνο εκτυπώσιμους απλούς(όχι special) χαρακτήρες π.χ
mypattern=r'k33theod@gmail 34' 
Το mypattern κάνει match, ταιριάζει δηλαδή, στην πρώτη ίδια ακολουθία που θα βρει στο κείμενο 
 
Πως λειτουργεί:
 
Έστω 
text="Mpla Mpla lala k33theod@gmail 34 oops osp"  
 
Όταν προσπαθήσω να βρω το mypattern στο text θα προσπαθεί να κάνει match το k 
μόλις συναντήσει τον πρώτο χαρακτήρα k στο text θα αρχίσει να κάνει έλεγχο για τους επόμενους χαρακτήρες 
εάν μέτα το k έρχεται το 3 θα συνεχίσει εάν όχι κάνει fail και ψάχνει το επόμενο k στο text 
εφόσον όλοι οι χαρακτήρες του pattern ταιριάζουν με ένα κομμάτι του κειμένου
θα μου επιστραφεί ενα match object που θα αντιστοιχεί στην 1η εύρεση του mypattern
Εάν έχω δηλαδή την ακολουθία 'k33theod@gmail 34' περισότερες από μία φορές στο κείμενό μου, 
το ψάξιμο θα σταματήσει και θα επιστραφεί το πρώτο match.
Εάν δεν το βρει καθόλου επιστρέφει None
 
Το πρόγραμμα σε python
>>> import re
>>> mypattern=r'k33theod@gmail 34'
>>> text="Mpla Mpla lala k33theod@gmail 34 oops osp"
>>> match_obj=re.search(mypattern, text)
>>> match_obj
<_sre.SRE_Match object; span=(15, 32), match='k33theod@gmail 34'>
>>> text[15:32]
'k33theod@gmail 34'
 
**Για να μπορέσουμε να κάνουμε περισσότερα πράγματα με τα regex χρησιμοποιούνται
ορισμένοι χαρακτήρες με ειδική χρήση. Αυτοί είναι
special characters
 the backslash \, the caret ^, the dollar sign $, the period or dot ., 
 the vertical bar or pipe symbol |, the question mark ?, the asterisk or star *, 
 the plus sign +, the opening parenthesis (, the closing parenthesis ), 
 the opening square bracket [, and the opening curly brace {, 
 These special characters are often called "metacharacters"
 
Όταν θέλω να χρησιμοποιήσω έναν από τους παραπάνω χαρακτήρες στο pattern μου χωρίς 
την ειδική του χρήση τον κάνω escape με backslash.
Έστω ότι θέλω να βρώ την τελεία, το pattern είναι
mypattern=r'\.' 
και θα κάνει match την πρώτη τελεία στο κείμενό μου.
 
Special characters
 
'\'
  Είτε κάνει escape special characters (permitting you to match characters like '*', '?', and so forth),
  ή σηματοδοτεί special sequence
 
  Επειδή η python χρησιμοποιεί επίσης το backslash ως ειδικό χαρακτήρα θα πρέπει κάθε φορά που κάνουμε
  ένα pattern να χρησιμοποιούμαι raw string δηλαδή raw_pattern pattern=r'pattern'
 
  Για την πρώτη χρήση του backslash είδαμε το παράδειγμα της . 
  Δεύτερη χρήση signals special sequences με την ευκαιρία βλέπουμε και την χρήση του special char [
 
  Τα regex έχουν έτοιμες κάποιες ακολουθίες χαρακτήρων που χρησιοποιούνται συχνά για να μην
  χρειάζεται κάθε φορά να τις δημιουργούμε εμείς
  Mια ακολουθία χαρακτήρων δημιουργείται με αγγύλες πχ
  [aeiou] αυτό κάνει match σε οποιοδήποτε χαρακτήρα περιέχει, έναν μόνο, δηλαδή 
  αν το text είναι
  text='kaeiou' και κάνουμε match θα κάνει μόνο τον χαρακτήρα a
  Για να ορίσουμε συνέχόμενους χαρακτήρες χρησιμοποιούμε μεταξύ τους το -
  [αβγδεζηθικ]  κάνει match οποιοδήποτε χαρακτήρα μεταξύ του α ελληνικό  και κ ελληνικό
  και μπορεί να γραφεί [α-κ]
  [0-9] κάνει match οποιοδήποτε αριθμό από το 0 εώς 9 προσοχή ένα μόνο ψηφίο όπως ξαναείπα
  και είναι ίδιο με το [0123456789]
 
  σε αυτό το τελευταίο παράδειγμα έρχεται η ένοια του special sequence επειδή
  το [0-9] έχει συχνή χρήση όταν κάνουμε match αριθμούς, έχουμε επίσης γι αυτό το 
  special sequence \d προσοχή δεν είναι ακριβώς το ίδιο 
  όμοια έχουμε το \w ίδιο με το [A-Za-z0-9_], πάλι δεν είναι ακριβώς το ίδιο 
  το [A-Za-z0-9_] κάνει match μόνο ascii ενώ το \w οποιοδήποτε αντίστοιχο χαρακτήρα στο unicode 
  πχ ελληνικά και άλλες γλώσσες  
  Εάν κάνω στα ελληνικά την ακολουθία 
  [α-ωΑ-Ω0-9_] δεν θα συμπεριλάβει το ά ενώ το \w θα το συμπεριλάβει
 
Με βάση όσα είπαμε παραπάνω μια μικρή άσκηση 
έχω ένα κείμενο που έχει ημερομηνία στη μορφή (23 Δεκ 2018 20:00)
και θέλω να κάνω ένα pattern για να το βρώ 
 
pattern_imerominias=r'[0-9][0-9] [α-ω,Α-Ω][α-ω,Α-Ω][α-ω,Α-Ω] [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]' 
το ίδιο με χρήση special sequences 
pattern_imerominias=r'\d\d \w\w\w \d\d\d\d \d\d:\d\d'
και ο κώδικας σε python
>>> pattern_imerominias=r'\d\d \w\w\w \d\d\d\d \d\d:\d\d'
>>> text= 'mapla mapla 16 ιου 2017 12:50 mpla'
>>> find=re.search(pattern_imerominias, text)
>>> find
<_sre.SRE_Match object; span=(12, 29), match='16 ιου 2017 12:50'>
>>> 
special character .
  Ο χαρακτήρα . κάνει match σε όλους τους χαρακτήρες εκτός τον newline
special character {
  Μέσα σε {min,max} ορίζουμε τον αριθμό των επαναλλήψεων του χαρακτήρα που προηγείται
  εάν δώσουμε μόνο έναν αριθμό πχ a{4} σημαίνει ότι οι επαναλήψεις πρέπει να είναι 4 και θα κάνει
  match στο πρώτο aaaa προσοχή εάν έχουμε aaaaaaa πάλι θα κάνει match στα πρώτα 4a
  ένα παραλείψουμε το min εννοείται 0 και γράφουμε πχ {,4} ενοείται 0-4 άν παραλείψουμε το max 
  εννοείται άπειρο {3,} πάνω από 3 επαναλήψεις
Με βάση τα παραπάνω το pattern_imerominias=r'\d\d \w\w\w \d\d\d\d \d\d:\d\d'  μπορεί να γίνει
pattern_imerominias=r'\d{2} \w{3} \d{4} \d{2}:\d{2}'
 
Πολλές φορές θέλουμε στην python να ελέγξουμε την ορθότητα ενός input
έστω ζητάμε από τον χρήστη να εισάγει έναν τριψήφιο αριθμό
μπορούμε να το ελέγξουμε εύκολα με ένα pattern
pattern_3digs=r'^\d{3}$'
άλλα patterns είναι αυτό της ημερομηνίας ώρας που είδαμε παραπάνω
έστω θέλουμε το ονοματεπώνυμο και την ηλικία στη μορφή (Κυριάκου Α. 45) επώνυμο ως 15 χαρακτήρες 
όνομα 1 και . ηλικία 1 ως 3 χαρακτήρες
pattern_person=r'^[a-zA-Z]{1,15} [A-Z]\. \d{1,3}$' την . επειδή είναι special char την κάνουμε escape.
Στα παραπάνω patterns χρησιμοποιούνται 2 ακόμα special chars
^
  κάνει match την αρχή του text
$
  κάνει match το τέλος του text
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": becoming_i, nickpsal

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4537

  • Αποστόλης
  • Το Άβαταρ του/της Αποστόλης
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 148
  • Ληφθείσες Ευχαριστίες 24
Μην παίρνεις τάνκ για να σκοτώσεις μυρμήγκι...
Χρησιμοποίεισε την split.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4538

  • nickpsal
  • Το Άβαταρ του/της nickpsal
  • Αποσυνδεμένος
  • py____
  • Δημοσιεύσεις: 22
  • Ληφθείσες Ευχαριστίες 3
χαχαχα μπαζουκας θα παρω !!!!!
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Θέμα με την re και dictionary 7 Χρόνια 5 Μήνες πριν #4539

  • Theo
  • Το Άβαταρ του/της Theo
  • Αποσυνδεμένος
  • pytho_
  • Δημοσιεύσεις: 249
  • Ληφθείσες Ευχαριστίες 70
Η χρήση γενικά των regex για να βρεις patterns είναι μονόδρομος
Κάποιος θέλει να βρεί σε ενα email ένα τηλέφωνο που έχει τη μορφή
415-555-9999
Η λύση χωρίς regex
def isPhone(text):
  if len(text) != 12:
    return False
  for i in range(0, 3):
    if not text[i].isdecimal():
       return False
  if text[3] != '-':
    return False
  for i in range(4, 7):
    if not text[i].isdecimal():
      return False
  if text[7] != '-':
    return False
  for i in range(8, 12):
    if not text[i].isdecimal():
      return False
  return True
 
for i in range(len(message)):
  chunk = message[i:i+12]
  if isPhone(chunk):
    print('Phone number found: ' + chunk)
    print('Done')  

Η λύση με regex
import re
mo=re.search(r'\d{3}-\d{3}-\d{4}', message)
mo.group()

Από το βιβλίο Automate the Boring Stuff with Python
Τελευταία διόρθωση: 7 Χρόνια 5 Μήνες πριν από Theo.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": becoming_i
  • Σελίδα:
  • 1
  • 2
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.507 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου