【问题标题】:Regular Expression for Stripping Strings from Source Code从源代码中剥离字符串的正则表达式
【发布时间】:2009-05-27 09:57:29
【问题描述】:

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

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

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。

谢谢。

【问题讨论】:

  • 你能说得更具体点吗?我完全不明白你的问题。例如,为什么“hello”+“word”会与“helloword”不同?
  • 我正在解析代码。如果解析器能够找出“hello”+“world”与“helloworld”相同,那将是一个不错的奖励,但不是必需的。我希望能澄清它。

标签: python regex string


【解决方案1】:

如果您要解析 Python 代码,请省去麻烦,让标准库的 parser module 完成繁重的工作。

如果您正在为某种自定义语言编写自己的解析器,那么从将一堆正则表达式组合在一起开始是非常诱人的,但不要这样做。你会把自己挖进一个无法维护的烂摊子。阅读解析技术并正确处理(维基百科canhelp)。

这个正则表达式适用于所有三个示例:

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

【讨论】:

  • 我没有解析 Python,我知道解析的挑战。我不打算使用正则表达式进行解析,而只是在解析之前剥离字符串以使我的解析更简单。
  • 很公平,添加了一个正则表达式,我认为它可以满足您的需求。
  • @Carl Meyer — 为了提高性能,我建议使用非捕获组并删除第一个量词,以防止量词在模棱两可的情况下“争吵”:r'"(?:"" |[^"])+"'
  • 很好,@Ben Blank,谢谢。编辑以包含您的建议。
  • "在解析之前剥离字符串以使我的解析更简单"??您的词法分析器仍然需要将“字符串”识别为字符串常量......那么为什么不在您的词法分析器中处理所有种类的字符串常量形式呢?顺便说一句,“嵌入式\”引号呢?
【解决方案2】:

也许:

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

编辑:

不,这不适用于最后一个示例。

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

我认为您必须手动完成,计数"s。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      相关资源
      最近更新 更多