Python替换字符串中最内部的2个括号字符

时间:2015-10-20 15:53:57

标签: python

我正在尝试将[[替换为{{,将]]替换为文件中的}}
但是如果有两个以上的连续方括号,我只想让它在最里面的2个括号上工作。
如果我有这个:[[[[它应该替换为[[{{,而]]]]应该替换为}}]]

4 个答案:

答案 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}}