如何在Python中修改此字符串

如何在Python中修改此字符串,python,regex,string,Python,Regex,String,我有一个字符串,需要在每个“[”或“]”前面加一个“\”,除非括号中包含一个像这样的x:“[x]”。在其他情况下,括号将始终包含一个数字 例如: 'Foo[123].bar[x]应该变成'Foo\[123\].bar[x]' 实现这一目标的最佳方式是什么?事先非常感谢。像这样的事情应该会奏效: >>> import re >>> >>> re.sub(r'\[(\d+)\]', r'\[\1\]', 'Foo[123].bar[x]') 'F

我有一个字符串,需要在每个“[”或“]”前面加一个“\”,除非括号中包含一个像这样的x:“[x]”。在其他情况下,括号将始终包含一个数字

例如:
'Foo[123].bar[x]
应该变成
'Foo\[123\].bar[x]'


实现这一目标的最佳方式是什么?事先非常感谢。

像这样的事情应该会奏效:

>>> import re
>>>
>>> re.sub(r'\[(\d+)\]', r'\[\1\]', 'Foo[123].bar[x]')
'Foo\\[123\\].bar[x]'

这样的事情应该行得通:

>>> import re
>>>
>>> re.sub(r'\[(\d+)\]', r'\[\1\]', 'Foo[123].bar[x]')
'Foo\\[123\\].bar[x]'

您可以这样做,而无需使用正则表达式:

s.replace('[', '\[').replace(']', '\]').replace('\[x\]', '[x]')

您可以这样做,而无需使用正则表达式:

s.replace('[', '\[').replace(']', '\]').replace('\[x\]', '[x]')

另一种方法是,只有在
[]
后面没有
x]
或前面没有
[x
时,才在
[]
前面加一个斜杠

result = re.sub(r"(\[(?!x\])|(?<!\[x)\])", r"\\\1", subject)

result=re.sub(r)(\[(?!x\]))|(?另一种方法,仅当它们后面没有
x]
或前面没有
[x
时,才在
[]
前面加一个斜杠

result = re.sub(r"(\[(?!x\])|(?<!\[x)\])", r"\\\1", subject)

result=re.sub(r)(\[(?!x\])|)(?对结果字符串进行三次完整扫描以获得所需的输出?对于长字符串,这将执行得很差。当然,在这种情况下,我主张使用正则表达式方法。我(可以说)提出了一种概念上更简单的方法,用于解决不存在问题的问题。如果性能是一个问题,则使用一次线性扫描(向前看一眼)无论如何都会比正则表达式好。在测试字符串
'Foo[123].bar[x]zzzzz'*100000
,2M字符长的情况下,我发现
re.sub
需要250毫秒(即使确保编译了模式),而
替换
只需要36毫秒。@g.d.d.c:它是O(n)。正则表达式可能是这项工作的最佳工具,但这是可以接受的。我需要转换的字符串最大长度为100个字符。因此,似乎此解决方案将是最快的三次结果字符串完整扫描,以实现所需的输出?对于长字符串,这将执行得很差。当然,在这种情况下,我主张使用正则表达式方法。当这不是问题时,我(可以说)提出了一种概念上更简单的方法。如果性能是一个问题,单次线性扫描(带有一个前瞻)无论如何都会优于正则表达式。对于测试字符串
'Foo[123].bar[x]zzzzz'*100000
,2M字符长,我发现
re.sub
需要250毫秒(即使确保模式被编译)而替换只需要36毫秒。@g.d.d.c:它是O(n)。正则表达式可能是完成这项工作的最佳工具,但这是可以接受的。我需要转换的字符串最大长度为100个字符。因此,这似乎是最快的解决方案。这是一个好的解决方案(只需事先编译正则表达式)。它可能会比三链替换稍微慢一点,因为正则表达式引擎意味着一些开销。但在任何情况下,此解决方案都更容易理解,并且在将来需求发生变化时也更容易修改。我是正则表达式新手,但在web的一点帮助下,我可以找出这一点的原因。谢谢,值得多学一点我看到的正则表达式。@saroele我推荐。这是一个很好的解决方案(只需事先编译正则表达式)。它可能会比三链替换稍微慢一点,因为正则表达式引擎意味着一些开销。但在任何情况下,此解决方案都更容易理解,并且在将来需求发生变化时也更容易修改。我是正则表达式新手,但在web的一点帮助下,我可以找出这一点的原因。谢谢,值得多学一点我看到的正则表达式。@saroele我推荐。啊,那么..你在哪里可以得到“给我密码”的+4这些天。我从下面的答案中学到了。这就是我的想法,对吗?感谢所有帮助我的人。但是选择答案很难。我会把它交给正则表达式,因为我从中学到了更多。啊,那么..你在哪里可以得到“给我密码”的+4这些天。我从下面的答案中学到了。这就是我的想法,对吗?感谢所有帮助我的人。但是选择答案很难。我会把它交给正则表达式方法,因为我从中学到了更多。