2015-07-14 3 views
6

Я пытаюсь извлечь данные года в формате ISI из Thomson-Reuters Web of Science. Линия для «Публикация года» выглядит следующим образом (в самом начале строки):Использование^для сопоставления начала строки в регулярном выражении Python

PY 2015 

Для сценария я пишу я определил следующее регулярное выражение функции:

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

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

findyears() 

Этот , однако дает ложные положительные результаты, поскольку шаблон может появляться в другом месте данных.

Итак, я хочу, чтобы соответствовать шаблону только в начале строки. Обычно для этой цели я бы использовал ^, но r'^PY (\d\d\d\d)' не удалось сопоставить мои результаты. С другой стороны, использование \n, похоже, делает то, что я хочу, но это может привести к дальнейшим осложнениям для меня.

+4

Используйте ['re.MULTILINE'] (http s: //docs.python.org/2/library/re.html#re.MULTILINE) для изменения семантики '^': 're.findall (r '^ PY (\ d \ d \ d \ d)' , wosrecords, re.MULTILINE) ' – Amadan

+0

Спасибо Амадан! Это решило мою проблему. – chrisk

ответ

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

должен работать, дайте мне знать, если это не так. У меня нет данных.

+0

Да, это решает мою проблему. Большое спасибо! – chrisk

+0

Отметить как верный bro – sinhayash

2

Использование re.search с 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)) 

См IDEONE demo

ОБЪЯСНЕНИЕ:

  • ^ - начало строки (из-за re.M)
  • PY - Буквальный PY
  • \s+ - 1 или более пробельные
  • (\d{4}) - группа захвата проведение 4-х цифр
+0

Да, это тоже должно работать. То, что я пропустил, это флаг re.M или re.MULTILINE, который я не знал. – chrisk

+0

На самом деле, это единственная функция 're.M': принудить'^'и' $ 'соответствовать в начале и в конце строки (до' \ n') соответственно. –

+1

Несомненно. Я многое узнал из вашего объяснения. – chrisk

0

В этом конкретном случае нет необходимости использовать регулярные выражения, потому что искомая строка всегда «PY» и, как ожидается, будет в начале строки, поэтому для этого задания можно использовать string.find. Функция find возвращает позицию, в которой подстрока находится в данной строке или строке, поэтому, если она найдена в начале строки, возвращаемое значение равно 0 (-1, если вообще не найдено), то есть:

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

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

Возможно, это может быть хорошей идеей, чтобы лишить белых пространств, т.е. .:

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

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

А дальше, если только год представляет интерес может быть извлечена с расколом, т.е. .:

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