以下代码是否有错误?
import re
text = 'AFL_v_CalcOneIntAreas (%as_Points[0].ub_X%);\n'
print(re.sub('as_Points[0].ub_X', '0x00', text))
预期输出
AFL_v_CalcOneIntAreas (%0x00%);
但实际输出与输入字符串相同,请告诉我为什么它会像这样?
答案 0 :(得分:3)
您应该逃避[
,]
和.
:
>>> re.sub('as_Points\[0\]\.ub_X', '0x00', text)
.
表示“任何字符”,[0]
仅匹配“0”。
您也可以这样做:
esc = re.escape('as_Points[0].ub_X') # now '[0]' is treated like the string
# literal '[0]' and not the regex '[0]'
re.sub(esc, '0x00', text)
访问re
module以获取更多有用的功能。
答案 1 :(得分:2)
您在正则表达式中搜索特殊字符。你必须逃脱它们。
text = 'AFL_v_CalcOneIntAreas (%as_Points[0].ub_X%);\n'
print(re.sub('as_Points\[0\]\.ub_X', '0x00', text))
答案 2 :(得分:2)
符号[
和]
表示正则表达式中的某些内容,您必须将其转义:
>>> re.sub('as_Points\[0\]\.ub_X', '0x00', text)
'AFL_v_CalcOneIntAreas (%0x00%);\n'
例如, [a-z]
表示所有低位字母。 [...]
用于表示“其中的任何内容”,因此[01]
代表0或1
在您的情况下,'as_Points[0].ub_X'
实际上是'as_Points0.ub_X'
。
请注意,.
也有特殊含义。这意味着1个角色。你也应该逃避它。
如果你不知道你的表达式是否包含你应该逃脱的字符,你可以使用re.escape:
>>> someExpression = "as_Points[0].ub_X"
>>> re.escape(someExpression)
'as\\_Points\\[0\\]\\.ub\\_X'
>>> re.sub(re.escape(someExpression), '0x00', text)
'AFL_v_CalcOneIntAreas (%0x00%);\n'
但是如果你不需要正则表达式,那么字符串就有了替换方法:
text.replace('as_Points[0].ub_X','0x00')
答案 3 :(得分:2)
如果您正在使用正则表达式,则需要使用反斜杠转义[]
之类的字符,因为它们具有特殊含义。
但是您不需要使用正则表达式来替换文字字符串。只需使用replace
:
print(text.replace('as_Points[0].ub_X','0x00'))
答案 4 :(得分:1)
您需要转发[
和]
以及点.
:
print(re.sub('as_Points\[0\]\.ub_X', '0x00', text))
# prints: AFL_v_CalcOneIntAreas (%0x00%);