源代码中剥离字符串的正则表达式

时间:2009-05-27 09:57:30

标签: python regex string

我正在寻找一个正则表达式,它将用一些常量字符串值(例如“string”)替换输入源代码中的字符串,并且还将考虑转义由双精度表示的字符串开始字符string-start字符(例如“他说”“你好”“”)。

为了澄清,我将提供一些输入和预期输出的例子:

input: print("hello world, how are you?")
output: print("string")

input: print("hello" + "world")
output: print("string" + "string")

# here's the tricky part:
input: print("He told her ""how you doin?"", and she said ""I'm fine, thanks""")
output: print("string")

我在使用Python,但我想这与语言无关。

编辑:根据其中一个答案,此要求可能不适合正则表达式。我不确定这是真的,但我不是专家。如果我试着用单词来表达我的要求,那么我正在寻找的是找到双引号之间的字符集,其中偶数组的相邻双引号应该被忽略,这听起来像我可以想象的DFA。

感谢。

3 个答案:

答案 0 :(得分:3)

如果您正在解析Python代码,请节省麻烦,让标准库的parser module解决这个问题。

如果您正在为某种自定义语言编写自己的解析器,那么通过将一堆正则表达式混合在一起开始是非常诱人的,但是不要这样做。你会把自己挖到一个难以维护的混乱中。阅读解析技巧并做好(维基百科can help)。

这个正则表达式可以解决你所有三个例子的问题:

re.sub(r'"(?:""|[^"])+"', '"string"', original)

答案 1 :(得分:0)

也许:

re.sub(r"[^\"]\"[^\"].*[^\"]\"[^\"]",'"string"',input)

编辑:

不,这不适用于最后的例子。

我不认为您的要求是正常的:它们不能与正则表达式匹配。这是因为在问题的核心,你需要匹配任何组合在一起的奇数",因为这是你的分隔符。

我认为你必须手动完成,计算" s。

答案 2 :(得分:0)

在ActiveState上有一个非常好的string-matching regular expression结束。如果它不能直接用于你的最后一个例子,那么将相邻的引用字符串组合在一起应该是一个相当简单的重复。