2015-07-14 20 views
6

'daki satırın başlangıcını eşleştirmek için^kullanarak, yayın yıllarını Thomson-Reuters Web of Science'dan ISI stili verileri ayıklamaya çalışıyorum.Python 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() 

Bu: Ben şu regex fonksiyon tanımladıysanız yazıyorum script

PY 2015 

: "Yayın Yılı" için çizgi (bir satırın başında) şöyle Ancak, yanlış pozitif sonuçlar verir, çünkü model verilerde başka bir yerde görünebilir.

Bu nedenle, yalnızca bir satırın başında deseni eşleştirmek istiyorum. Normalde bu amaç için ^ kullanırım, ancak sonuçlarımı eşleştirmek için r'^PY (\d\d\d\d)' başarısız olur. Öte yandan, \n kullanmak istediğimi yapıyor gibi görünüyor, ancak bu benim için daha fazla komplikasyonlara yol açabilir.

+4

['re.MULTILINE'] kullanın (http s: //docs.python.org/2/library/re.html#re.MULTILINE) '^' semantiklerini değiştirmek için: re.findall (r '^ PY (\ d \ d \ d \ d)' , wosrecords, re.MULTILINE) – Amadan

+0

Teşekkür ederim Amadan! Bu benim problemimi çözdü. – chrisk

cevap

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

tutan. Verileriniz yok.

+0

Evet, bu benim sorunumu çözüyor. Çok teşekkür ederim! – chrisk

+0

Doğru olarak işaretle – sinhayash

2

Kullanım re.searchre.M ile:

  • ^ - Başlangıç ​​
  • (nedeniyle re.M kadar) bir hattın:

    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

    AÇIKLAMA Bkz-1 veya daha fazla boşluk

  • (\d{4}) - - PY
  • \s+ Değişmez Yakalama grup çalışması bunları yapmazsa bana bildirin gereken 4 rakamını
+0

Evet, bu da işe yaramalı. Ne ben özledim re.M veya re.MULTILINE bayrağı, ben etkilemiyordu ^. – chrisk

+0

Aslında, bu 're.M' işlevinin tek işlevi: sırasıyla '^' ve '$' satırının başlangıcında ve sonunda ('\ n' önce) eşleşmesi için zorlanır. –

+1

Elbette. Açıklamandan çok şey öğrendim. – chrisk

0

Bu özel durumda, düzenli ifadelerin kullanılmasına gerek yoktur, çünkü aranan dize her zaman 'PY' olur ve satırın başında olması beklenir, dolayısıyla bu iş için string.find kullanılabilir. find işlevi, belirtilen dize veya satırda alt dizenin bulunduğu konumu döndürür, bu nedenle dizenin başında bulunursa, döndürülen değer 0'dır (-1, hiç değilse), örneğin:

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

In [13]: ' PY 2015'.find('PY') 
Out[13]: 1 
sadece yıl bölünmüş çıkarılabilir faiz, yani .:

In [16]: ' PY 2015'.strip().split()[1] 
Out[16]: '2015' 
arasında ise

Belki de iyi bir beyaz boşluk şerit fikir yani .:

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

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

Ve ertesi olabilir