2

正規表現を使用して引用からページ番号を抽出しようとしています。

私が扱っているテストデータは次のとおりです。

  • ジャーナル名、巻。20、2号。p。15
  • ジャーナル名、巻。20、2号:人名(1990年~2010年)p。15
  • ジャーナル名、巻。20、2号:人名(1990年~2010年)15~20ページ
  • ジャーナル名、巻。20、2号:人名(1990年~2010年)15ページ~
  • ジャーナル名、巻。20、2号。20-25
  • ジャーナル名、巻。20、2号。ISSN: 1234-1234 (印刷); 20-25
  • ジャーナル名、巻。20、2号。20-25 ; ISSN: 1234-1234 (プリント)
  • ジャーナル名、巻。20、2号。ISSN: 1234-1234 (印刷); ISSN: 1234-1234 (オンライン); 20-25
  • ジャーナル名、巻。20、2号。ISSN 1234-1234 (印刷); ISSN 1234-1234 (オンライン); 20-25

次の正規表現を使用する場合:

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

上記の太字の値は一致しています。

\d+-\d+「ISSN」または「ISSN:」の後に来るものと一致しないようにその正規表現を改善したいと思います。を使用して後読みを追加しようとしまし(?<![ISSN:?\s])たが、成功しませんでした。

それを達成し、以下の値のみを一致させる方法について何か考えはありますか?

  • ジャーナル名、巻。20、2号。p。15
  • ジャーナル名、巻。20、2号:人名(1990年~2010年)p。15
  • ジャーナル名、巻。20、2号:人名(1990年~2010年)15~20ページ
  • ジャーナル名、巻。20、2号:人名(1990年~2010年)15ページ~
  • ジャーナル名、巻。20、2号。20-25
  • ジャーナル名、巻。20、2号。ISSN: 1234-1234 (印刷); 20-25
  • ジャーナル名、巻。20、2号。20-25 ; ISSN: 1234-1234 (プリント)
  • ジャーナル名、巻。20、2号。ISSN: 1234-1234 (印刷); ISSN: 1234-1234 (オンライン); 20-25
  • ジャーナル名、巻。20、2号。ISSN 1234-1234 (印刷); ISSN 1234-1234 (オンライン); 20-25
4

2 に答える 2

0

^$アンカーを使用して、別の否定的な先読みを使用できます。

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

また、この正規表現を複数行のテキストに適用する場合は、flag! を使用する必要があることに注意してくださいre.M。これにより、開始アンカーと終了アンカーが文字列全体ではなく各行の開始と終了に一致します!

\sまた、2 番目のグループの前にa を追加する必要がありs(\d+-\d+)ます。正規表現の 2 番目の一致が希望の数字になります。

デモ

>>> 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']
于 2015-04-28T15:04:23.167 に答える