2015-07-14 15 views
6

Próbuję wyodrębnić lata publikacji w stylu ISI z Thomson-Reuters Web of Science. Linia dla „Rok wydania” wygląda następująco (na samym początku linii):Używanie^do dopasowywania początku linii w Pythonie regex

PY 2015 

za scenariusz piszę mam zdefiniowane następujące regex funkcję:

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

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

findyears() 

ten daje jednak fałszywie dodatnie wyniki, ponieważ wzorzec może pojawić się w innych miejscach danych.

Tak więc, chcę dopasować tylko wzór na początku linii. Normalnie użyłbym do tego celu ^, ale r'^PY (\d\d\d\d)' zawodzi w dopasowywaniu moich wyników. Z drugiej strony, używanie \n wydaje się robić to, co chcę, ale to może prowadzić do dalszych komplikacji dla mnie.

+4

Użyj ['re.MULTILINE'] (http s: //docs.python.org/2/library/re.html#re.MULTILINE) aby zmienić semantykę '^': 're.findall (r '^ PY (\ d \ d \ d \ d)' , wosrecords, re.MULTILINE) ' – Amadan

+0

Dziękuję Amadan! To rozwiązało mój problem. – chrisk

Odpowiedz

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

powinny działać, pozwól mi wiedzieć, czy nie. Nie mam twoich danych.

+0

Tak, to rozwiązuje mój problem. Dziękuję Ci bardzo! – chrisk

+0

Oznacz jako poprawny brat – sinhayash

2

Zastosowanie re.search z 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)) 

Zobacz IDEONE demo

WYJAŚNIENIE:

  • ^ - początek linii (ze względu na re.M)
  • PY - Dosłowne PY
  • \s+ - 1 lub więcej spacji
  • (\d{4}) - grupa przechwytywania trzyma 4 cyfry
+0

Tak, to też powinno działać. Brakowało mi flagi re.M lub re.MULTILINE, o których nie wiedziałem, że wpłynęły na ^. – chrisk

+0

W rzeczywistości jest to jedyna funkcja 're.M': wymuszanie'^'i' $ 'odpowiednio na początku i na końcu linii (przed' \ n'). –

+1

Pewnie. Wiele się nauczyłem z twoich wyjaśnień. – chrisk

0

W tym szczególnym przypadku nie ma potrzeby korzystania z wyrażeń regularnych, ponieważ wyszukiwany ciąg jest zawsze "PY" i oczekuje się, że będzie na początku wiersza, więc można użyć string.find dla tego zadania. Funkcja find zwraca pozycję, w której znajduje się podciąg w podanym łańcuchu lub linii, więc jeśli zostanie znaleziona na początku ciągu, zwrócona wartość wynosi 0 (-1, jeśli nie zostanie znaleziona w ogóle), tj .:

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

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

może to być dobry pomysł, aby odizolować spacji, np .:

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

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

A w przyszłym roku, jeśli tylko jest przedmiotem zainteresowania mogą być wyodrębnione z rozłamu, tj .:

In [16]: ' PY 2015'.strip().split()[1] 
Out[16]: '2015' 
Powiązane problemy