我正在尝试将[[
替换为{{
,将]]
替换为文件中的}}
。
但是如果有两个以上的连续方括号,我只想让它在最里面的2个括号上工作。
如果我有这个:[[[[
它应该替换为[[{{
,而]]]]
应该替换为}}]]
答案 0 :(得分:0)
你可以使用负向前瞻(找到最里面的左括号)和负向后瞻(找到最里面的右括号):
>>> import re
>>> original = "[This] [[is]] [[[a]]] [[[[test]]]]"
>>> left_replaced = re.sub("\[\[(?!\[)", "{{", original)
>>> left_replaced
'[This] {{is]] [{{a]]] [[{{test]]]]'
>>> result = re.sub("(?<!\])\]\]", "}}", left_replaced)
>>> result
'[This] {{is}} [{{a}}] [[{{test}}]]'
请注意,如果两对用空格或任何其他字符分隔,这将替换连续的四个方括号(从您的问题中不清楚您想如何处理这种情况):
>>> original = "[This] [[is]] [[[a]]] [[ [[test]] ]]"
>>> left_replaced = re.sub("\[\[(?!\[)","{{",original)
>>> left_replaced
'[This] {{is]] [{{a]]] {{ {{test]] ]]'
>>> result = re.sub("(?<!\])\]\]", "}}", left_replaced)
>>> result
'[This] {{is}} [{{a}}] {{ {{test}} }}'
答案 1 :(得分:0)
虽然如果效率是一个主要考虑因素,正则表达式是最好的方法,如果你只有几千个中等长度的字符串,你可以使用更清晰的代码来做到这一点:
string = '[[abc[[cde]]ghi]]]]'
leftBrackets = [i for i in range(len(string)-1) if string[i:i+2] == '[[' and
(i == len(string)-2 or string[i+2] != '[')]
rightBrackets = [i for i in range(len(string)-1) if string[i:i+2] == ']]' and
(i == len(string)-2 or string[i+2] != ']')]
for index in leftBrackets:
string = string[:index] + '{{' + string[index+2:]
for index in rightBrackets:
string = string[:index] + '}}' + string[index+2:]
print(string)
打印
{{abc{{cde}}ghi]]}}
如果你是使用它们的专家,正则表达式很棒,但我不是。我已经完成了“掌握正则表达式”,但我没有太多机会使用它们,所以我忘记了除了最基本的东西之外的所有东西。虽然我可以查找高级内容,但我记不住了,所以一周左右后,我的代码对我来说变得难以理解。因此,我甚至不会考虑使用正则表达式来做这样的事情,除非上面的简单代码变得太慢。
当然,其他人会不同意我的意见,并留下粗鲁的评论,但你可能想考虑我对此事的看法。
实际上,我会将leftBrackets和rightBrackets的定义放在try except
块中,并取消对范围结束的检查。
答案 2 :(得分:-1)
使用正则表达式,您可以使用前瞻和后瞻:
>>> import re
>>> s = "[[{{ }}]] [[ ]]"
>>> s = "[[[[ ]]]] [[ ]]"
>>> a = re.sub("(?<=\[{2})\[\[","{{",s)
>>> a
'[[{{ ]]]] [[ ]]'
>>> a = re.sub("(?=\]{4})\]\]","}}",s)
>>> a
'[[[[ }}]] [[ ]]'
答案 3 :(得分:-2)
可能有比我更好的正则表达式,但这是一个快速的解决方案。
{{1}}