2016-08-19 8 views
2

私はPythonで正規表現を使用してBibTexから文字列を取得しようとしています。私はタイトルの文字列を、つかむしたいpython regex複数の行にまたがる一致を見つける

a = '''title = {The Origin ({S}, 
     {Se}, and {Te})- {TiO$_2$} Photocatalysts}, 
    year = {2010}, 
    volume = {114},''' 

:ここに私の文字列の一部である

pattern = re.compile('title\s*=\s*{(.*|\n?)},\s*\n', re.DOTALL|re.I) 
pattern.findall(a) 

しかし、それだけで:

The Origin ({S}, 
     {Se}, and {Te})- {TiO$_2$} Photocatalysts 

私は現在、このコードを持っています私に教えてください:

['The Origin ({S},\n   {Se}, and {Te})- {TiO$_2$} Photocatalysts},\n  year = {2010'] 

yearの情報がないタイトル文字列全体? 何度も、yeartitleの直後にありません。だから私は使用することはできません。

pattern = re.compile('title\s*=\s*{(.*|\n?)},\s*\n.*year', re.DOTALL|re.I) 
pattern.findall(a) 
+0

http://stackoverflow.com/questions/587345/python-regular-expression-matching-a-multiline-block-of-text –

+0

私はそれを試みましたが、まだ私の問題を解決できませんでした。 –

答えて

1

迅速な解決策は、あなたの正規表現パターン

pattern = re.compile('title\s*=\s*{(.*|\n?)},\s*\n', re.DOTALL|re.I) 
+0

これは間違っていることがわかりました。 'year'行をつかむ –

1

を修正することですあなたが正規表現になりたいか、一般的に依存します。私はあなたの文字列に{と}を含めることができると思いますので、パターンの終わりをマークするためにそれを使用すると問題が発生します。また、複数の括弧がある可能性があります。

ここでは、正規表現の終わりにyearという単語を探して、それが定数であると仮定した場合の考え方を示します。

pattern = re.compile('title\s*=\s*{(.*?)},\s*\n\s*year', re.DOTALL|re.I) 
+0

' year'は何度も 'title'の後にはありません。しかし、あなたはまだ私にこのことをするための新しい考えを与えています:) –

0

textwrap役立つことができます:

import textwrap 

a = '''title = {The Origin ({S}, 
     {Se}, and {Te})- {TiO$_2$} Photocatalysts}, 
    year = {2010}, 
    volume = {114},''' 

indent = " " 
print(textwrap.dedent(indent + a)) 
1

regex module以降を使用します。

import regex as re 

rx = re.compile(r''' 
     (?(DEFINE) 
      (?<part>\w+\ =\ \{) 
      (?<end>\},) 
      (?<title>title\ =\ \{) 
     ) 
     (?&title)(?P<t>(?:(?!(?&part))[\s\S])+)(?&end) 
    ''', re.VERBOSE) 

string = ''' 
title = {The Origin ({S}, 
     {Se}, and {Te})- {TiO$_2$} Photocatalysts}, 
    year = {2010}, 
    volume = {114}, 
''' 

title = rx.search(string).group('t') 
print(title) 
# The Origin ({S}, 
# {Se}, and {Te})- {TiO$_2$} Photocatalysts 

それは本当にそれは別の解決策を提供し、必要とされていませんけれども。

関連する問題