正则表达式搜索和替换包含正则表达式语句的变量字符串

时间:2014-10-18 20:31:50

标签: python regex

我想用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

1 个答案:

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