我想用re.sub
替换字符串的一部分,我确切地知道它是什么样的。相关部分代码:
print "Regex statement: ", foundStatements[iterator]
print "string to replace with : \n", latexPreparedString
print "string to search&replace in: \n", fileAsString
processedString = re.sub(foundStatements[iterator], latexPreparedString, fileAsString)
print "processed string: \n", processedString
在我的测试用例中,foundStatements[iterator]
为"%@import script_example.py ( *out =(.|\n)*?return out)"
但即使processedString
包含foundStatements[iterator]
,processedString
看起来与fileAsString
完全相同,所以它尚未完成re.sub
任务。我做错了什么?
编辑:好的,它肯定与我正在搜索的包含正则表达式代码的字符串有关。有没有办法让它只是将它foundStatements[iterator]
解释为要搜索的原始字符串?我能想到的唯一解决方案是创建一个用\ regexsymbol替换字符串中的任何正则表达式符号的函数(例如* - > \ *),但是有一种方法可以通过内置方法来解决这个问题。功能。它也有点矫枉过正,因为我必须确保它适用于每一个正则表达式符号,其中有很多:/
EDIT2 :好吧,只需将其更改为re.sub(re.escape(foundStatements[iterator]), latexPreparedString, fileAsString)
似乎有效。除非正则表达式语句没有命中原始文件中的任何内容。要解释一下,latexPreparedString
是使用foundStatements[iterator]
的正则表达式部分生成的。虽然在正则表达式语句没有命中任何内容时它不能将latexPreparedString
设置为任何内容是合乎逻辑的,但我默认设置latexPreparedString = "
“,因此在这种情况下它应该{{1}如果它没有碰到任何东西,请用空白字符串替换它。以下是如何编写代码:pastebin.com/wUedK3LN
答案 0 :(得分:0)
首先,要替换字符串中的完全匹配,您应该使用[string.replace()][1]
:
processedString = fileAsString(foundStatements[iterator], latexPreparedString)
但是,在您的情况下,这仍然会失败,因为foundStatements[iterator]
中有换行符。要转义它,您需要在声明foundStatements[iterator]
时使用the r
prefix。
如果您仍想使用re.sub
,则必须在字符串前添加r
前缀,并使用re.escape(foundStatements[iterator])
代替foundStatements[iterator]
。您可以详细了解re.escape
here。