匹配字符串中的组多次

时间:2016-09-21 16:10:07

标签: python regex

我正在尝试使用正则表达式。我有这个必须匹配的字符串

 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。

1 个答案:

答案 0 :(得分: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