2016-09-21 45 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))+ 

我正在使用python。

+0

你想要的只是'hlist'之后的文本还是你想得到没有括号的名字列表? –

+0

我想将括号内的hlist后的文字。此外,由于hlist标签可能出现在其他字段中(请参阅上面的main_interests示例),我想确保我匹配的文本属于精确字段(例如影响)。 –

+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'] 

这里使用两个表达式,一个用于外部({{hlist...}}),另一种为内部分([[...]])。


请参阅 a demo on regex101.com

+1

如果字符串开始处的影响标记为不缺席。 –

+0

@JacopoTerrinoni:不缺席? – Jan

+0

不包含在字符串中。 –

相关问题