2016-09-21 7 views
2

正規表現を使用しようとしています。私は、私は、テキストから以下のテンプレートを抽出したい文字列内のグループに複数回一致する

influences = 
{{hlist |[[Plato]] |[[Aristotle]] |[[Socrates]] |[[David Hume]] |[[Adam Smith]] |[[Cicero]] |[[John Locke]]}} 
{{hlist |[[Saint Augustine]] |[[Saint Thomas Aquinas]] |[[Saint Thomas More]] |[[Richard Hooker]] |[[Edward Coke]]}} 
{{hlist |[[Thomas Hobbes]] |[[Rene Descartes]] |[[Montesquieu]] |[[Joshua Reynolds]] |[[Sir William Blackstone|William Blackstone]]}} 
{{hlist |[[Niccolo Machiavelli]] |[[Dante Alighieri]] |[[Samuel Johnson]] |[[Voltaire]] |[[Jean Jacques Rousseau]] |[[Jeremy Bentham]]}} 

を一致させる必要があり、この文字列を持っている:

{{hlist .... }} 

代わりに、次のテキストが一致するようにしていません。

main_interests = 
{{hlist |[[Music]] |[[Art]] |[[Theatre]] |[[Literature]]}} 

私はこの正規表現を書いたが、それは

(?:^\|\s*)?(?:influences)\s*?=\s*?(?:(?:\s*\{\{hlist)\s*\|([\d\w\s\-()*—&;\[\]|#%.<>·:/",\'!{}=•?’ 
á~ü°œéö$àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]*?)(?=\n))+ 
01を動作しません。

私はPythonを使用しています。

+0

'hlist'の後ろのテキストだけか、角括弧なしで名前のリストを取得したいですか? –

+0

大括弧の中のhlistの後のテキストを取りたいと思います。さらに、hlistタグは他のフィールド(main_interestsの上記の例を参照)に表示される可能性があるため、一致するテキストが正確なフィールド(例:influnces)に属することを確認したいと思います。 –

+0

正規表現 '\\ s * =(?:\\ s * {{hlist(?:\\ s * \\ | \\ [\\ [([^]] +)\\] \])+}})* '。尋ねられたテキストをキャプチャします。 C#を使うと、 'matches [0] .Groups [1] .Captures'を使ってグループのすべてのキャプチャを取得できます。 –

答えて

0

あなたは、いくつかの正規表現でリストの内包表記を使用することができます。

import re 
string = """ 
influences = 
{{hlist |[[Plato]] |[[Aristotle]] |[[Socrates]] |[[David Hume]] |[[Adam Smith]] |[[Cicero]] |[[John Locke]]}} 
{{hlist |[[Saint Augustine]] |[[Saint Thomas Aquinas]] |[[Saint Thomas More]] |[[Richard Hooker]] |[[Edward Coke]]}} 
{{hlist |[[Thomas Hobbes]] |[[Rene Descartes]] |[[Montesquieu]] |[[Joshua Reynolds]] |[[Sir William Blackstone|William Blackstone]]}} 
{{hlist |[[Niccolo Machiavelli]] |[[Dante Alighieri]] |[[Samuel Johnson]] |[[Voltaire]] |[[Jean Jacques Rousseau]] |[[Jeremy Bentham]]}} 
""" 

matches = [template.group(1) 
      for match in re.findall(r'\{\{hlist.+?\}}', string) 
      for template in re.finditer(r'\[\[([^]]+)\]\]', match)] 
print(matches) 
# ['Plato', 'Aristotle', 'Socrates', 'David Hume', 'Adam Smith', 'Cicero', 'John Locke', 'Saint Augustine', 'Saint Thomas Aquinas', 'Saint Thomas More', 'Richard Hooker', 'Edward Coke', 'Thomas Hobbes', 'Rene Descartes', 'Montesquieu', 'Joshua Reynolds', 'Sir William Blackstone|William Blackstone', 'Niccolo Machiavelli', 'Dante Alighieri', 'Samuel Johnson', 'Voltaire', 'Jean Jacques Rousseau', 'Jeremy Bentham'] 

これは、2つの式、外側部分({{hlist...}})と内側部分([[...]])のための別の1のための1つを使用しています。


a demo on regex101.comを参照してください。

+1

正規表現は、文字列の先頭にある影響タグが不在ではない。 –

+0

@JacopoTerrinoni:不在ですか? – Jan

+0

文字列に含まれていません。 –

関連する問題