关于wiki文本模板的Python正则表达式

时间:2013-12-26 12:33:18

标签: python regex wikitext

我正在尝试使用以下形式的wikitext模板从Python中删除换行符:

{{cite web
|title=Testing
|url=Testing
|editor=Testing
}}

应使用re.sub:

获得以下内容
{{cite web|title=Testing|url=Testing|editor=Testing}}

我一直在尝试Python正则表达几个小时,但还没有成功。例如,我尝试过:

while(re.search(r'\{cite web(.*?)([\r\n]+)(.*?)\}\}')):
     textmodif=re.sub(r'\{cite web(.*?)([\r\n]+)(.*?)\}\}', r'{cite web\1\3}}', textmodif,re.DOTALL)

但它没有按预期工作(即使没有while循环,它也不适用于第一个换行符。)

我发现了类似的问题,但它没有帮助:Regex for MediaWiki wikitext templates。我对Python很陌生,所以请不要对我太过刻意: - )

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您需要为.启用换行符匹配;否则匹配换行符:

re.search(r'\{cite web(.*?)([\r\n]+)(.*?)\}\}', inputtext, flags=re.DOTALL)

您希望匹配的文本中有多个换行符,因此只匹配一组连续的换行符是不够的。

来自re.DOTALL documentation

  

使'.'特殊字符与任何字符匹配,包括换行符;如果没有此标记,'.'将匹配换行符之外的任何内容。

您可以使用一次re.sub()调用一次性删除cite节中的所有换行符,而无需循环:

re.sub(r'\{cite web.*?[\r\n]+.*?\}\}', lambda m: re.sub('\s*[\r\n]\s*', '', m.group(0)), inputtext, flags=re.DOTALL)

这使用嵌套的正则表达式从匹配的文本中删除其中至少有一个换行符的所有空格。

演示:

>>> import re
>>> inputtext = '''\
... {{cite web
... |title=Testing
... |url=Testing
... |editor=Testing
... }}
... '''
>>> re.search(r'\{cite web(.*?)([\r\n]+)(.*?)\}\}', inputtext, flags=re.DOTALL)
<_sre.SRE_Match object at 0x10f335458>
>>> re.sub(r'\{cite web.*?[\r\n]+.*?\}\}', lambda m: re.sub('\s*[\r\n]\s*', '', m.group(0)), inputtext, flags=re.DOTALL)
'{{cite web|title=Testing|url=Testing|editor=Testing}}\n'