我正在寻找一个正则表达式,它将用一些常量字符串值(例如“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。
感谢。
答案 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结束。如果它不能直接用于你的最后一个例子,那么将相邻的引用字符串组合在一起应该是一个相当简单的重复。