2015-04-28 19 views
2

我正在嘗試使用正則表達式從引用中提取頁碼。如何使用Python和正則表達式從引文中提取頁碼?

下面是測試數據我的工作:

  • 期刊名稱,卷。 20號,2號;頁。 15
  • Journal Name,Vol。 20,第2號:人名(1990-2010);頁。 15
  • Journal Name,Vol。 20,第2號:人名(1990-2010); 15-20
  • Journal Name,Vol。 20,第2號:人名(1990-2010); pp。15-
  • Journal Name,Vol。 20號,2號; 20-25
  • Journal Name,Vol。 20號,2號; ISSN:1234-1234(Print); 20-25
  • Journal Name,Vol。 20號,2號; 20-25; ISSN:1234-1234(Print)
  • Journal Name,Vol。 20號,2號; ISSN:1234-1234(Print); ISSN:1234-1234(Online); 20-25
  • Journal Name,Vol。 20號,2號; ISSN 1234-1234(平面); ISSN 1234-1234(Online); 20-25

當使用正則表達式如下:

(?![^()]*\))(\d+-\d+) 

粗體上述匹配的值。

我想改善這種正則表達式不匹配「ISSN」或之後不能有任何\d+-\d+「ISSN:」。我嘗試使用(?<![ISSN:?\s])添加後視效果,但沒有成功。

有關如何實現該目標並僅匹配以下值的任何想法?

  • 期刊名稱,卷。 20號,2號;頁。 15
  • Journal Name,Vol。 20,第2號:人名(1990-2010);頁。 15
  • Journal Name,Vol。 20,第2號:人名(1990-2010); 15-20
  • Journal Name,Vol。 20,第2號:人名(1990-2010); pp。15-
  • Journal Name,Vol。 20號,2號; 20-25
  • Journal Name,Vol。 20號,2號; ISSN:1234-1234(Print); 20-25
  • Journal Name,Vol。 20號,2號; 20-25; ISSN:1234-1234(Print)
  • Journal Name,Vol。 20號2; ISSN:1234-1234(Print); ISSN:1234-1234(Online); 20-25
  • Journal Name,Vol。 20號,2號; ISSN 1234-1234(打印); ISSN 1234-1234(在線); 20-25
+0

'[ISSN:?\ s]'不會**按照您的想法做...嘗試類似https://regex101.com/#python,它將添加一個解釋和相當突出顯示。 – jonrsharpe

+0

感謝您的鏈接!在正則表達式的開始我嘗試了'[ISSN:?\ s]',但那不起作用;它仍然與測試字符串中的幾個「1234-1234」匹配。 –

+0

**閱讀說明**:'[ISSN:?\ s]'**匹配下面列表中的單個字符**:'ISSN:?'列表中的單個字符'ISN:?'直接區分大小寫)'\ s'匹配任何空格字符['\ r \ n \ t \ f'] – jonrsharpe

回答

0

您可以^$錨提前使用其他負面的樣子:

^((?!ISSN).)*(?![^()]*\))\s(\d+-\d+)$ 

請注意,如果你想在一個多行文本應用此正則表達式,你需要使用re.M標誌!使開始和結束錨點匹配每行的開始和結束,而不是整個字符串!

另外您還需要在第二組s(\d+-\d+)之前添加一個\s,那麼您的正則表達式中的第二個匹配將成爲渴望的數字!

Demo

>>> s="""Journal Name, Vol. 20, No. 2; p. 15 
... Journal Name, Vol. 20, No. 2: Human Name (1990-2010); p. 15 
... Journal Name, Vol. 20, No. 2: Human Name (1990-2010); pp. 15-20 
... Journal Name, Vol. 20, No. 2: Human Name (1990-2010); pp. 15- 
... Journal Name, Vol. 20, No. 2; 20-25 
... Journal Name, Vol. 20, No. 2; ISSN: 1234-1234 (Print); 20-25 
... Journal Name, Vol. 20, No. 2; 20-25; ISSN: 1234-1234 (Print) 
... Journal Name, Vol. 20, No. 2; ISSN: 1234-1234 (Print); ISSN: 1234-1234 (Online); 20-25 
... Journal Name, Vol. 20, No. 2; ISSN 1234-1234 (Print); ISSN 1234-1234 (Online); 20-25""" 
>>> 

>>> re.findall(r'^((?!ISSN).)*(?![^()]*\))\s(\d+-\d+)$',s,re.M) 
[('.', '15-20'), (';', '20-25')] 

而對於得到的數字:

>>> [i[-1] for i in re.findall(r'^((?!ISSN).)*(?![^()]*\))\s(\d+-\d+)$',s,re.M)] 
['15-20', '20-25'] 
+0

感謝您的支持,但我嘗試在https://regex101.com/#python上使用它,並且它沒有返回任何匹配。我使用了'g'修飾符,因爲它不用於多行文本。 –

+0

@AndréA。請參閱'演示程序'我把答案放在裏面! https://regex101.com/r/mR5xT6/1 – Kasramvd

+0

謝謝!但是它不符合'Journal Name,Vol。 20號,2號; 20-25; ISSN:1234-1234(Print)',例如:( –

1

這解決了我的問題:

re.search(r'[^ISN:?](?![^()]*\))\s(\d+-\d+)', s).group(1) 

謝謝大家的幫忙。更好的解決方案仍然受歡迎

+0

哎呀!我怎麼想這個? :) 謝謝! – Kasramvd

+0

我知道你指定了一個Python解決方案,但存在一個Ruby gem來解析以任何樣式格式化的引用:https://github.com/inukshuk/anystyle-parser –

相關問題