正则表达式子问题

时间:2009-05-22 11:53:16

标签: python regex

好的,所以我对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,因为它的设置如何不花一整天。

我真的很好奇为什么要这样做。对于上述问题。

4 个答案:

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