我正在尝试从以下形式的wiki文本模板中删除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(.*?)([rn]+)(.*?)}}')):
textmodif=re.sub(r'{cite web(.*?)([rn]+)(.*?)}}', r'{cite web13}}', textmodif,re.DOTALL)
但它没有按预期工作(即使没有 while 循环,它对第一个换行符不起作用)。
我发现了这个类似的问题,但它没有帮助:MediaWiki wiki文本模板的正则表达式。我对Python很陌生,所以请不要对我太苛刻:-)
提前谢谢你。
您需要为 .
打开换行符匹配; 否则它不匹配换行符:
re.search(r'{cite web(.*?)([rn]+)(.*?)}}', inputtext, flags=re.DOTALL)
在要匹配的文本中分布有多个换行符,因此仅匹配一组连续的换行符是不够的。
从re.DOTALL
文档中:
使
'.'
特殊字符与任何字符(包括换行符)匹配;如果没有此标志,'.'
将匹配除换行符之外的任何字符。
您可以使用一个re.sub()
调用一次性删除cite
节中的所有换行符,而无需循环:
re.sub(r'{cite web.*?[rn]+.*?}}', lambda m: re.sub('s*[rn]s*', '', m.group(0)), inputtext, flags=re.DOTALL)
这使用嵌套正则表达式从匹配的文本中删除所有至少包含一个换行符的空格。
演示:
>>> import re
>>> inputtext = '''
... {{cite web
... |title=Testing
... |url=Testing
... |editor=Testing
... }}
... '''
>>> re.search(r'{cite web(.*?)([rn]+)(.*?)}}', inputtext, flags=re.DOTALL)
<_sre.SRE_Match object at 0x10f335458>
>>> re.sub(r'{cite web.*?[rn]+.*?}}', lambda m: re.sub('s*[rn]s*', '', m.group(0)), inputtext, flags=re.DOTALL)
'{{cite web|title=Testing|url=Testing|editor=Testing}}n'