好的,所以我对re.sub。
有一个半问题请使用以下代码:
import re
str_to_be_subbed = r'somefile.exe -i <INPUT>'
some_str = r'C:\foobar'
s = re.sub(r'\<INPUT\>', some_str, str_to_be_subbed)
print s
我认为它会给我:
somefile.exe -i C:\\foobar
但相反它给了我:
somefile.exe -i C:♀oobar
我知道\ f是一个转义字符,但即使我尝试这样做,这应该逃避特殊的字符。即使我这样做:
print r'%s' % s
它仍然给了我这个:
somefile.exe -i C:♀oobar
为什么这样做?最新的方法是避免这种情况吗?
Ninja编辑:
如果我看一下s的值,那就是:
'somefile.exe -i C:\x0coobar'
为什么\ f变为\ x0。啊。
编辑:
还有一个问题,如果我修改代码:
import re
import os
str_to_be_subbed = r'somefile.exe -i <INPUT>'
some_str = os.path.abspath(r'C:\foobar')
some_str
s = re.sub(r'\<INPUT\>', some_str, str_to_be_subbed)
print s
给我:
>>> import re
>>> import os
>>> str_to_be_subbed = r'somefile.exe -i <INPUT>'
>>> some_str = os.path.abspath(r'C:\foobar')
>>> some_str
'C:\\foobar'
>>> s = re.sub(r'\<INPUT\>', some_str, str_to_be_subbed)
>>> print s
somefile.exe -i C:♀oobar
现在为什么呢。因为os.path.abspath逃脱了\'s。为什么re.sub仍然搞砸了?
这也是一个非常小的例子,在一个古老的应用程序中随机出现的这个小问题。我真的不能把它改成string.replace,因为它的设置如何不花一整天。
我真的很好奇为什么要这样做。对于上述问题。
答案 0 :(得分:3)
\f
是表单Feed 字符。逃避它,它的工作原理:
some_str = r'C:\\foobar'
另一种解决方案:
s = re.sub(r'<INPUT>', some_str.encode("string_escape"), str_to_be_subbed)
答案 1 :(得分:3)
不要使用正则表达式:
print str_to_be_subbed.replace("<INPUT>",some_str)
正如documentation所说:
repl可以是字符串或函数;如果 它是一个字符串,任何反斜杠逃脱 在它处理。
答案 2 :(得分:2)
Python文档说...
re.sub(pattern,repl,string,count = 0,flags = 0) 返回通过替换repl替换字符串中最左边的非重叠模式而获得的字符串。如果未找到模式,则返回字符串不变。 repl可以是字符串或函数;如果它是一个字符串,则处理其中的任何反斜杠转义。也就是说,\ n被转换为单个换行符,\ r \ n被转换为回车符,依此类推。诸如\ j之类的未知转义单独留下
这就是为什么它给'C:♀oobar'。
但如果我们给它一个函数作为第二个参数,它不会转换任何反斜杠转义。
所以试试......
>>>import re
>>>str_to_be_subbed = r'somefile.exe -i <INPUT>'
>>>some_str = r'C:\foobar'
>>>s = re.sub(r'\<INPUT\>', lambda _:some_str, str_to_be_subbed)
>>>print s
somefile.exe -i c:\foobar
答案 3 :(得分:0)
您的示例不需要正则表达式,请使用str.replace()
:
>>> str_to_be_subbed.replace('<INPUT>',some_str)
'somefile.exe -i C:\\foobar'
>>>