Python Κανονικές Εκφράσεις για την εφαρμογή της μη διαφυγής εγχόρδων

ψήφοι
11

Είμαι προσπαθεί να εφαρμόσει μη διαφυγής string με Python regex και ορισθούν, και δεν φαίνεται να θέλουν να λειτουργούν πολύ καλά. Είμαι σίγουρος ότι κάτι κάνω λάθος, αλλά δεν μπορώ να καταλάβω τι ...

>>> import re
>>> mystring = rThis is \n a test \r
>>> p = re.compile( \\\\(\\S) )
>>> p.sub( \\1, mystring )
'This is n a test r'
>>> p.sub( \\\\\\1, mystring )
'This is \\n a test \\r'
>>> p.sub( \\\\1, mystring )
'This is \\1 a test \\1'

Θα ήθελα να αντικαταστήσει \\ [char] με \ [χαρα], αλλά ορισθούν σε Python δεν φαίνεται να ακολουθούν τους ίδιους κανόνες που κάνουν σε κάθε άλλη εφαρμογή που έχω χρησιμοποιήσει ποτέ. Θα μπορούσε κάποιος να ρίξει λίγο φως;

Δημοσιεύθηκε 17/08/2008 στις 19:20
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
3

Λοιπόν, νομίζω ότι μπορεί να έχετε χάσει το r ή miscounted τους κάθετους ...

"\\n" == r"\n"

>>> import re
>>> mystring = r"This is \\n a test \\r"
>>> p = re.compile( r"[\\][\\](.)" )
>>> print p.sub( r"\\\1", mystring )
This is \n a test \r
>>>

Που, αν κατάλαβα είναι αυτό που ζητήθηκε.

Υποψιάζομαι ότι το πιο κοινό αίτημα είναι η εξής:

>>> d = {'n':'\n', 'r':'\r', 'f':'\f'}
>>> p = re.compile(r"[\\]([nrfv])")
>>> print p.sub(lambda mo: d[mo.group(1)], mystring)
This is \
 a test \
>>>

Ο ενδιαφερόμενος φοιτητής πρέπει επίσης να διαβάσετε Ken Thompson για Σκέψεις για Εμπιστοσύνη Η εμπιστοσύνη» , όπου ο ήρωας μας χρησιμοποιεί ένα παρόμοιο παράδειγμα για να εξηγήσει τους κινδύνους της εμπιστοσύνης μεταγλωττιστές δεν έχετε bootstrapped από τον κώδικα μηχανής εαυτό σας.

Απαντήθηκε 17/08/2008 στις 20:01
πηγή χρήστη

ψήφοι
0

Είστε να παρασυρθείτε από την εκπροσώπηση της Python της συμβολοσειράς αποτέλεσμα. Η έκφραση Python:

'This is \\n a test \\r'

αντιπροσωπεύει τη συμβολοσειρά

This is \n a test \r

το οποίο είναι νομίζω αυτό που ήθελε. Δοκιμάστε να προσθέσετε «εκτύπωση» μπροστά από κάθε μία από p.sub σας () καλεί να εκτυπώσετε την πραγματική σειρά επέστρεψε αντί αναπαράσταση Python του string.

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r
Απαντήθηκε 17/08/2008 στις 20:26
πηγή χρήστη

ψήφοι
0

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

Ένα άλλο επεξηγηματικό παράδειγμα:

>>> mystring = r"This is \n ridiculous"
>>> print mystring
This is \n ridiculous
>>> p = re.compile( r"\\(\S)" )
>>> print p.sub( 'bloody', mystring )
This is bloody ridiculous
>>> print p.sub( r'\1', mystring )
This is n ridiculous
>>> print p.sub( r'\\1', mystring )
This is \1 ridiculous
>>> print p.sub( r'\\\1', mystring )
This is \n ridiculous

Αυτό που θα ήθελα να εκτυπώσετε είναι

This is 
ridiculous
Απαντήθηκε 17/08/2008 στις 20:40
πηγή χρήστη

ψήφοι
8

Δεν είναι ότι αυτό το δεύτερο παράδειγμα Anders' κάνει;

Στο 2,5 υπάρχει επίσης μια string-escapeκωδικοποίηση, μπορείτε να εφαρμόσετε:

>>> mystring = r"This is \n a test \r"
>>> mystring.decode('string-escape')
'This is \n a test \r'
>>> print mystring.decode('string-escape')
This is 
 a test 
>>> 
Απαντήθηκε 17/08/2008 στις 22:36
πηγή χρήστη

ψήφοι
0

Σημάδι; δεύτερο παράδειγμα του απαιτεί κάθε διέφυγε χαρακτήρα ρίχνονται σε μια σειρά αρχικά, η οποία δημιουργεί ένα KeyError αν η ακολουθία διαφυγής συμβαίνει να μην είναι στη σειρά. Θα πεθάνουν για οτιδήποτε άλλο εκτός από τους τρεις χαρακτήρες που παρέχονται (να \ va δοκιμή), και απαριθμώντας κάθε δυνατή ακολουθία διαφυγής κάθε φορά που θέλετε να ακολουθίας διαφυγής μια σειρά (ή να διατηρήσετε μια παγκόσμια σειρά) είναι μια πραγματικά κακή λύση. Ανάλογα προς PHP, που είναι με τη χρήση preg_replace_callback()με ένα λάμδα αντί της preg_replace(), η οποία είναι τελείως περιττή σε αυτή την κατάσταση.

Λυπάμαι αν είμαι έρχεται από το ένα πουλί γι 'αυτό, είμαι απλά εντελώς απογοητευμένοι με την Python. Αυτό υποστηρίζεται από κάθε άλλη μηχανή κανονική έκφραση που έχω χρησιμοποιήσει ποτέ, και δεν μπορώ να καταλάβω γιατί αυτό δεν θα μπορούσε να λειτουργήσει.

Ευχαριστω για την ΑΝΤΑΠΟΚΡΙΣΗ; η string.decode('string-escape')λειτουργία είναι ακριβώς αυτό που έψαχνα αρχικά. Αν κάποιος έχει μια γενική λύση στο πρόβλημα backreference regex, μη διστάσετε να το δημοσιεύσετε και θα δέχονται αυτό ως απάντηση, καθώς και.

Απαντήθηκε 17/08/2008 στις 22:55
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more