2015-07-14 11 views
6

Sto cercando di estrarre anni di pubblicazione in stile ISI dal Web of Science di Thomson-Reuters. La linea per "anno di pubblicazione" assomiglia a questo (proprio all'inizio di una riga):Uso di^per far corrispondere l'inizio della riga in Python regex

PY 2015 

Per lo script sto scrivendo ho definito la seguente funzione regex:

import re 
f = open('savedrecs.txt') 
wosrecords = f.read() 

def findyears(): 
    result = re.findall(r'PY (\d\d\d\d)', wosrecords) 
    print result 

findyears() 

Questo , tuttavia, fornisce risultati falsi positivi perché il modello può apparire altrove nei dati.

Quindi, voglio solo abbinare il modello all'inizio di una linea. Normalmente userei lo ^ per questo scopo, ma r'^PY (\d\d\d\d)' non riesce ad abbinare i miei risultati. D'altra parte, usare \n sembra fare quello che voglio, ma ciò potrebbe portare a ulteriori complicazioni per me.

+4

Utilizzare ['re.MULTILINE'] (http s: //docs.python.org/2/library/re.html#re.MULTILINE) per cambiare la semantica di '^': 're.findall (r '^ PY (\ d \ d \ d \ d)' , wosrecords, re.MULTILINE) ' – Amadan

+0

Grazie Amadan! Questo ha risolto il mio problema. – chrisk

risposta

7
re.findall(r'^PY (\d\d\d\d)', wosrecords, flags=re.MULTILINE) 

dovrebbe funzionare, fatemi sapere se non è così. Non ho i tuoi dati.

+0

Sì, questo risolve il mio problema. Grazie mille! – chrisk

+0

Contrassegna come bro corretto – sinhayash

2

Usa re.search con re.M:

import re 
p = re.compile(r'^PY\s+(\d{4})', re.M) 
test_str = "PY123\nPY 2015\nPY 2017" 
print(re.findall(p, test_str)) 

Vedi IDEONE demo

SPIEGAZIONE:

  • ^ - Inizio di una riga (a causa di re.M)
  • PY - letterale PY
  • \s+ - 1 o più spazi bianchi
  • (\d{4}) - gruppo Capture tenendo 4 cifre
+0

Sì, questo dovrebbe funzionare anche. Quello che mi mancava era la bandiera re.M o re.MULTILINE, che non sapevo influenzare il ^. – chrisk

+0

In realtà, questa è l'unica funzione di 're.M': forzare'^'e' $' a corrispondere all'inizio e alla fine della riga (prima di '\ n') rispettivamente. –

+1

Sicuro. Ho imparato molto dalla tua spiegazione. – chrisk

0

In questo caso particolare non è necessario utilizzare le espressioni regolari, poiché la stringa cercata è sempre "PY" e dovrebbe essere all'inizio della riga, quindi è possibile utilizzare string.find per questo lavoro. La funzione find restituisce la posizione in cui si trova la sottostringa nella stringa o linea specificata, quindi se viene trovata all'inizio della stringa il valore restituito è 0 (-1 se non viene rilevato), ovvero:

In [12]: 'PY 2015'.find('PY') 
Out[12]: 0 

In [13]: ' PY 2015'.find('PY') 
Out[13]: 1 

Forse potrebbe essere una buona idea per togliere gli spazi bianchi, vale a dire .:

In [14]: ' PY 2015'.find('PY') 
Out[14]: 2 

In [15]: ' PY 2015'.strip().find('PY') 
Out[15]: 0 

E successivo se solo l'anno è di interesse può essere estratto con split, vale a dire .:

In [16]: ' PY 2015'.strip().split()[1] 
Out[16]: '2015' 
Problemi correlati