Rilevanza delle espressioni regolari
Negli ultimi anni, c'è stato un cambiamento drammatico nell'uso di linguaggi di programmazione generici per la scienza dei dati e l'apprendimento automatico. Non è sempre stato così: un decennio fa, Questo pensiero avrebbe incontrato molti occhi scettici!
Ciò significa che più persone / le istituzioni utilizzano strumenti come Python / JavaScript per risolvere le tue esigenze di dati. È qui che le espressioni regolari diventano super utili. Le espressioni regolari sono regolarmente il modo predefinito per pulire e contestare i dati nella maggior parte di questi strumenti.. O l'estrazione di parti specifiche di testo da pagine web, dai un senso ai dati di Twitter o prepara i tuoi dati per l'estrazione di testo, regex è la scelta migliore per tutte queste attività.
Data la sua applicabilità, ha senso conoscerli e usarli correttamente.
Cosa imparerai da questo post?
In questo post, Ti guiderò nell'uso, esempi e applicazioni di espressioni regolari. Le espressioni regolari sono molto popolari tra i programmatori e possono essere applicate in molti linguaggi di programmazione come Java, JS, php, C ++, eccetera. Per sviluppare la nostra comprensione, abbiamo spiegato questo concetto usando il linguaggio di programmazione Python. All'estremità, ho risolto vari problemi usando regex.
Iniziamo!
Che cos'è l'espressione regolare e come viene utilizzata?
Brevemente, l'espressione regolare è una sequenza di caratteri utilizzata principalmente per trovare e sostituire modelli in una stringa o in un file. Come ho detto precedentemente, sono compatibili con la maggior parte dei linguaggi di programmazione come python, perla, R, Java e molti altri. Quindi, impararli aiuta in molti modi (Più su questo più tardi).
Le espressioni regolari utilizzano due tipi di caratteri:
un) metacaratteri: Come suggerisce il nome, questi caratteri hanno un significato speciale, equivalente a * nel jolly.
B) letterali (Come, B, 1,2…)
e pitone, abbiamo il modulo “RifCosa aiuta con le espressioni regolari. Quindi devi importare la libreria Rif prima di poter usare le espressioni regolari in Python.
Usa questo codice --> Importa re
Gli usi più comuni delle espressioni regolari sono:
- Cerca una stringa (cerca e abbina)
- Trova una stringa (trova tutto)
- Rompi la stringa in una sottostringa (Condividere)
- Sostituisci parte di una stringa (sub)
Vediamo i metodi che la libreria “Rif”Prevede di eseguire questi compiti.
Nota: Abbiamo anche un videocorso sull'elaborazione del linguaggio naturale che copre anche le espressioni regolari. Controllalo!
Quali sono i diversi metodi regex?
Il pacchetto 're'’ fornisce vari metodi per interrogare una stringa di input. Ecco i metodi più utilizzati, Discuterò:
- rivincita()
- indagare()
- re.trovare ()
- re.split ()
- re.sub ()
- ri.compila ()
Vediamoli uno per uno.
rivincita(Modello, corda):
Questo metodo trova una corrispondenza se si verifica all'inizio della stringa. Come esempio, chiama partita () en la cadena ‘AV Analytics AV’ e cerca un "modello AV"’ corrisponderà. Nonostante questo, se cerchiamo solo Analytics, il modello non corrisponderà. Facciamolo in Python ora.
Ecco una finestra di codifica dal vivo per iniziare. Puoi eseguire i codici e ottenere il risultato in questa finestra:
Sopra puoi vedere la posizione iniziale e finale del modello corrispondente "AV"’ sulla corda e, A volte, aiuta molto quando si esegue la manipolazione della corda.
indagare(Modello, corda):
È equivalente a corrispondere () ma non ci limita a cercare corrispondenze solo all'inizio della stringa. A differenza del metodo precedente, qui la ricerca del 'pattern analitico’ restituirà una partita.
Codice
risultato = Rif.ricerca(r'Analisi', 'AV DataPeaker AV') Stampa risultato.gruppo(0) Produzione: Analisi
Qui puoi vedere che il metodo di ricerca () può trovare uno schema da qualsiasi posizione nella stringa, ma restituisce solo la prima occorrenza del modello di ricerca.
re.trovareModello, corda):
Quella aiuta a ottenere un elenco di tutti i modelli corrispondenti. Non hai restrizioni di ricerca dall'inizio o dalla fine. Se usiamo il metodo findall per cercare 'AV’ in una data stringa, restituirà entrambe le occorrenze di AV. Durante la ricerca di una stringa, Ti consiglierei di usare re.trovare () per sempre, può funzionare come re.search () y re.match () entrambi.
Codice
risultato = Rif.trova tutto(ambra', 'AV DataPeaker AV') Stampa risultato Produzione: ['DI', 'DI']
re.splitModello, corda, [maxsplit=0]):
Questo metodo aiuta a dividere corda dalle occorrenze di dato Modello.
Codice
risultato=Rif.diviso(r'y',"Analisi") risultato Produzione: ['Anale', 'tic']
Al di sopra, abbiamo diviso la catena “Analisi” di “e”. Il metodo diviso () ha un altro argomento “maxsplit“. Ha un valore predefinito di zero. In questa circostanza fa le massime divisioni che si possono fare, ma se diamo valore a maxsplit, dividerà la catena. Vediamo il seguente esempio:
Codice
risultato=Rif.diviso(r'io','DataPeaker') risultato di stampa Produzione: ['Analisi', 'cs V', 'dya'] #Ha eseguito tutte le spaccate che si possono fare per schema "io". Codice risultato=Rif.diviso(r'io','DataPeaker',maxsplit=1) risultato Produzione: ['Analisi', 'cs Vidya']
Qui, puoi vedere che abbiamo impostato maxsplit in 1. E il risultato è che ha solo due valori, mentre il primo esempio ha tre valori.
re.subModello, risponditore, corda):
Aiuta a trovare un modello e sostituirlo con una nuova sottostringa. Se il modello non viene trovato, corda viene restituito invariato.
Codice
risultato=Rif.sub(r'India','il mondo',"AV è la più grande comunità di Analytics dell'India") risultato Produzione: "AV è la più grande community di Analytics del mondo"
ri.compilaModello, risponditore, corda):
Possiamo combinare un modello regex in oggetti modello, che può essere usato per abbinare i modelli. È anche utile cercare di nuovo un modello senza ridigitarlo..
Codice
importare Rif modello=Rif.compilare('DI') risultato=modello.trova tutto('AV DataPeaker AV') Stampa risultato risultato2=modello.trova tutto("AV è la più grande comunità di analisi dell'India") Stampa risultato2 Produzione: ['DI', 'DI'] ['DI']
Riepilogo rapido dei vari metodi:
Fino ad ora, analizziamo vari metodi regex usando un modello costante (caratteri fissi). Ma, Cosa succede se non abbiamo un modello di ricerca costante e vogliamo restituire un insieme specifico di caratteri? (definito da una regola) di una catena? Non farti intimidire.
Questo può essere facilmente risolto definendo un'espressione con l'aiuto di operatori di pattern (caratteri meta e letterali). Diamo un'occhiata agli operatori di pattern più comuni.
Quali sono gli operatori più utilizzati?
Le espressioni regolari possono specificare modelli, non solo caratteri fissi. Questi sono gli operatori più utilizzati che aiutano a generare un'espressione per rappresentare i caratteri richiesti in una stringa o in un file. Comunemente utilizzato nel web scraping e nel text mining per estrarre le informazioni richieste.
operatori | Descrizione |
. | Corrisponde a qualsiasi singolo carattere tranne la nuova riga ‘ n'. |
? | essere d'accordo con 0 oh 1 aspetto del motivo alla tua sinistra |
+ | 1 o più occorrenze del modello alla tua sinistra |
* | 0 o più presenze del motivo alla tua sinistra |
w | Corrisponde a un carattere alfanumerico mentre W (W mayuscula) corrisponde a un carattere non alfanumerico. |
D | Corrispondenze cifre [0-9] e / D (D mayuscula) corrisponde a nessuna cifra. |
S | Corrisponde a un singolo carattere di spazio bianco (spazio, nuova linea, Restituzione, tabulazione, modulo) y S (S mayúscula) corrisponde a qualsiasi carattere non di spaziatura. |
B | confine tra parola e non parola e / B è opposto / B |
[..] | Corrisponde a qualsiasi singolo carattere tra parentesi e [^..] corrisponde a qualsiasi singolo carattere che non sia tra parentesi |
Utilizzato per caratteri di significato speciale come . coincidere con un punto o + per il segno più. | |
^ e $ | ^ e $ corrisponde rispettivamente all'inizio o alla fine della stringa |
{Nuovo Messico} | Corrisponde ad almeno n e al massimo m occorrenze dell'espressione precedente se la scriviamo come {, m} quindi restituirà almeno qualsiasi occorrenza minima alla massima m precedente all'espressione. |
un | B | Corrisponde a o b |
() | Raggruppa le espressioni regolari e restituisce il testo corrispondente |
T, n, R | Scheda Partite, nuova linea, Restituzione |
Per maggiori dettagli sui metacaratteri “(“, “)”, “|” e altri dettagli, puoi controllare questo link (https://docs.python.org/2/library/re.html).
Ora, Comprendiamo gli operatori di pattern guardando i seguenti esempi.
Alcuni esempi di espressioni regolari
Problema 1: Restituisce la prima parola di una data stringa
Soluzione-1 Estrai ogni carattere (usando “ w“)
Codice
importare Rif risultato=Rif.trova tutto(R'.',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['UN', 'V', ' ', 'io', 'S', ' ', 'l', 'un', 'R', 'G', 'e', 'S', 'T', ' ', 'UN', 'n', 'un', 'l', 'e', 'T', 'io', 'C', 'S', ' ', 'C', 'O', 'm', 'm', 'tu', 'n', 'io', 'T', 'e', ' ', 'O', 'F', ' ', 'IO', 'n', 'D', 'io', 'un']
Sopra estrae anche lo spazio, ora per evitare che venga utilizzato “ w” invece di “.“.
Codice
risultato=Rif.trova tutto(r'w',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['UN', 'V', 'io', 'S', 'l', 'un', 'R', 'G', 'e', 'S', 'T', 'UN', 'n', 'un', 'l', 'e', 'T', 'io', 'C', 'S', 'C', 'O', 'm', 'm', 'tu', 'n', 'io', 'T', 'e', 'O', 'F', 'IO', 'n', 'D', 'io', 'un']
Soluzione-2 Estrai ogni parola (usando “*” oh “+“)
Codice
risultato=Rif.trova tutto(r'w*',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['DI', '', 'è', '', 'maggiore', '', "Analisi", '', 'Comunità', '', 'di', '', 'India', '']
Un'altra volta, sta restituendo lo spazio come una parola perché “*”Restituisce zero o più corrispondenze di pattern alla sua sinistra. Ora, per cancellare gli spazi, andremo con “+“.
Codice
risultato=Rif.trova tutto(r'w+',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['DI', 'è', 'maggiore', "Analisi", 'Comunità', 'di', 'India']
Soluzione-3 Estrai ogni parola (usando “^“)
Codice
risultato=Rif.trova tutto(r'^w+',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['DI']
Se usiamo "$" invece di "^", restituirà la parola dalla fine della stringa. Veamoslo.
Codice
risultato=Rif.trova tutto(r'w+$',"AV è la più grande comunità di Analytics dell'India") Stampa risultato
Produzione:
['India']
Problema 2: Restituisce i primi due caratteri di ogni parola
Soluzione-1 Estrai due caratteri consecutivi da ogni parola, spazi esclusi (usando “ w“)
Codice
risultato=ri.trovare(r'ww',"AV è la più grande comunità di Analytics dell'India") risultato di stampa Produzione: ['DI', 'è', 'il', 'rg', 'è', 'Un', 'al', 'sì', 'circuito integrato', 'co', 'mm', 'un', 'esso', 'di', 'In', 'di']
Soluzione-2 Estrai due caratteri consecutivi tra quelli disponibili all'inizio del confine di parola (usando “B“)
risultato=Rif.trova tutto(r'bw.',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['DI', 'è', 'il', 'Un', 'co', 'di', 'In']
Problema 3: Restituisce il tipo di dominio degli ID email forniti
Per spiegarlo semplicemente, Ci tornerò con un approccio passo dopo passo:
Soluzione-1 Estrai tutti i caratteri dopo “@”
Codice
risultato=Rif.trova tutto(r'@w+','[e-mail protetta], [e-mail protetta], [e-mail protetta], [e-mail protetta]') Stampa risultato Produzione: ['@gmail', '@test', '@analyticsvidhya', '@riposo']
Al di sopra, puoi vedere che la parte “.insieme a”, “.in” non è estratto. Per aggiungerlo, andremo con il seguente codice.
risultato=ri.trovare(r'@w+.w+','[e-mail protetta], [e-mail protetta], [e-mail protetta], [e-mail protetta]') risultato di stampa Produzione: ["@gmail.com", '@test.in', '@analyticsvidhya.com', '@rest.biz']
Soluzione – 2 Estrai solo il nome di dominio usando “()”
Codice
risultato=ri.trovare(r'@w+.(w+)','[e-mail protetta], [e-mail protetta], [e-mail protetta], [e-mail protetta]') risultato di stampa
Produzione: ['insieme a', 'in', 'insieme a', "biz"]
Problema 4: data di ritorno della stringa data
Qui useremo “D”Per estrarre la cifra.
Soluzione:
Codice
risultato=ri.trovare(r'd{2}-D{2}-D{4}','Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009') risultato di stampa Produzione: ['12-05-2007', '11-11-2011', '12-01-2009']
Se vuoi estrarre solo un anno, la parentesi"()" ti aiuterà.
Codice
risultato=Rif.trova tutto(r'd{2}-D{2}-(D{4})','Amit 34-3456 12-05-2007, XYZ 56-4532 11-11-2011, ABC 67-8945 12-01-2009') Stampa risultato Produzione: ['2007', '2011', '2009']
Problema 5: Restituisce tutte le parole in una stringa che iniziano con una vocale
Soluzione-1 Restituisce ogni parola
Codice
risultato=Rif.trova tutto(r'w+',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['DI', 'è', 'maggiore', "Analisi", 'Comunità', 'di', 'India']
Soluzione-2 Le parole di ritorno iniziano con alfabeti (usando [])
Codice
risultato=Rif.trova tutto(R'[aeiouAEIOU]w+',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['DI', 'è', 'più grande', "Analisi", 'comunità', 'di', 'India']
Sopra puoi vedere che è tornato “argest” e “comunità” dal centro delle parole. Per cancellare questi due, dobbiamo usare ” B” per il limite della parola.
Soluzione 3
Codice
risultato=Rif.trova tutto(r'b[aeiouAEIOU]w+',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['DI', 'è', "Analisi", 'di', 'India']
Equivalentemente, possiamo estrarre parole che iniziano con costante usando "^" tra parentesi.
Codice
risultato=Rif.trova tutto(r'b[^ aeiouAEIOU]w+',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: [' è', ' maggiore', "Analisi", ' Comunità', ' di', ' India']
Sopra puoi vedere che hai restituito parole che iniziano con spazio. Per rimuoverlo dall'output, includi uno spazio tra parentesi[].
Codice
risultato=Rif.trova tutto(r'b[^ aeiouAEIOU ]w+',"AV è la più grande comunità di Analytics dell'India") Stampa risultato Produzione: ['maggiore', 'Comunità']
Problema 6: convalidare un numero di telefono (il numero di telefono deve avere 10 cifre e inizia con 8 oh 9)
Abbiamo un elenco di numeri di telefono nell'elenco “al” e qui convalideremo i numeri di telefono usando
Soluzione
Codice
importare re li=['999999999','999999-999','99999x9999'] per val in li: se ri.match(R'[8-9]{1}[0-9]{9}',valore) e len(valore) == 10: stampa "sì" altro: stampa 'no'
Produzione: sì no no
Problema 7: dividere una stringa con molti delimitatori
Soluzione
Codice
importare Rif linea = 'asdf fjdk;afed,fjek,asdf,pippo' # La stringa ha più delimitatori (";",","," "). risultato= Rif.diviso(R'[;,S]', linea) Stampa risultato Produzione: ['asdf', 'fjdk', 'nutrito', 'fjek', 'asdf', 'pippo']
Possiamo anche usare il metodo re.sub () per sostituire questi delimitatori multipli con uno come spazio "".
Codice
importare Rif linea = 'asdf fjdk;afed,fjek,asdf,pippo' risultato= Rif.sub(R'[;,S]',' ', linea) Stampa risultato Produzione: asdf fjdk afed fjek asdf foo
Problema 8: recuperare informazioni da un file HTML
Voglio estrarre informazioni da un file HTML (vedere i dati di esempio di seguito). Qui dobbiamo estrarre le informazioni disponibili tra
excepto el primer indiceIl "Indice" È uno strumento fondamentale nei libri e nei documenti, che consente di individuare rapidamente le informazioni desiderate. In genere, Viene presentato all'inizio di un'opera e organizza i contenuti in modo gerarchico, compresi capitoli e sezioni. La sua corretta preparazione facilita la navigazione e migliora la comprensione del materiale, rendendolo una risorsa essenziale sia per gli studenti che per i professionisti in vari settori.... numerico. Ho assunto qui che il codice html di seguito sia memorizzato in una stringa str.
Esempio di file HTML (str)
<tr allineare="centro"><td>1</td> <td>Noè</td> <td>Emma</td></vero> <tr allineare="centro"><td>2</td> <td>Liam</td> <td>Olivia</td></vero> <tr allineare="centro"><td>3</td> <td>Muratore</td> <td>Sofia</td></vero> <tr allineare="centro"><td>4</td> <td>Giacobbe</td> <td>Isabella</td></vero> <tr allineare="centro"><td>5</td> <td>William</td> <td>Ava</td></vero> <tr allineare="centro"><td>6</td> <td>Ethan</td> <td>Mia</td></vero> <tr allineare="centro"><td>7</td> <td HTML>Michael</td> <td>emily</td></vero>
Soluzione:
Codice
risultato=ri.trovare(R'<td>w+</td>S<td>(w+)</td>S<td>(w+)</td>',str) risultato di stampa Produzione: [('Noè', 'Emma'), ('Liam', 'Olivia'), ('Muratore', "Sofia"), ('Giacobbe', 'Isabella'), ('William', 'Ava'), ('Ethan', 'Mia'), ('Michael', "Emilio")]
Puoi leggere il file html usando la libreria urllib2 (vedi codice sotto).
Codice
import urllib2 risposta = urllib2.urlopen('') html = risposta.leggi()
Note finali
In questo post, abbiamo discusso sull'espressione regolare, i metodi e i metacaratteri per formare un'espressione regolare. Abbiamo anche analizzato diversi esempi per vederne gli usi pratici.. Qui ho cercato di introdurti all'espressione regolare e di coprire i metodi più comuni per risolvere i problemi di massima espressione regolare.
Il post ti è stato utile?? Fateci sapere i vostri pensieri su questa guida nella sezione commenti qui sotto..