【问题标题】:Transform a regular expression into another将正则表达式转换为另一个
【发布时间】:2011-10-19 15:55:12
【问题描述】:

我必须编写正则表达式来匹配一些可标记的文本,并且添加所有\s* 和\s+ 会很麻烦,因为空格的数量并不重要或根本不需要。

我想要的是一个接受正则表达式和分隔符列表的函数,然后为我添加空格匹配。

例如:

make_whitespace(regex="foo\.(\w+)\(a\)",delimiters="()[]{},.+-")

应该返回

"foo\s*\.\s*(\s*\w+\s*)\(\s*a\s*\)"

也许已经有更好的方法来实现这一点,而不是破解现有的正则表达式;但我认为使用完整的解析器生成器将是矫枉过正。我正在使用 Python。

谢谢。

【问题讨论】:

  • 所以除了标记文本的问题之外,您还添加了标记正则表达式的问题。
  • @StevenRumbalski he he, true ;-)
  • "\s*".join(["foo","\.","(","\w+",")\(","a","\)"]) 这样的东西怎么样?不过,我想这实际上并没有节省任何打字......
  • 虽然这个想法在理论上听起来不错,但实际上很难做到 - 特别是当您考虑捕获组时 - 在您的示例中,您在捕获组的外部和内部添加空格(其中\.( 转换为 \.\s*(\s* - 我相信正则表达式引擎不会捕获任何空格,但会在捕获之前允许它......你想要它做什么?
  • @CodeJockey 是的,他们是贪婪的运算符(除非附加问号),所以第一个会得到所有的空格

标签: python regex whitespace transformation tokenize


【解决方案1】:

我在正则表达式文档中添加了一个示例,以展示如何仅使用正则表达式来编写灵活的分词器:http://docs.python.org/py3k/library/re.html#writing-a-tokenizer

它展示了如何从片段构建正则表达式以及如何忽略空格。

或者,您可以考虑对输入进行两次传递。首先,执行 re.sub 以仅用一个空格替换重复的空格空格(制表符、换行符、一系列空格等)。之后,实际解析器的正则表达式会简单得多。

祝你好运。

【讨论】:

  • 每个人都使用正则表达式进行“灵活的分词器”。查看与解析器生成器一起使用的任何令牌生成器;令牌的输入规范实际上总是作为正则表达式给出。
【解决方案2】:

我们的DMS Software Reengineering Toolkit 可以做到这一点。它接受语言定义为 EBNF,构建 AST,并允许您将 source to source 转换应用于 AST,然后从 AST 重新生成文本。

正则表达式需要 EBNF,但这很简单。

【讨论】:

  • 嘿嘿,看来你有一个非常好的工具包,但这比使用 pyparsing 或类似的小任务更矫枉过正 ^_^ 无论如何,+1 有趣的阅读(通过顺便说一句,第二个链接坏了!)
  • @fortran:链接已修复。所以坏消息是不能用纯正则表达式处理正则表达式(括号必须匹配)。因此,要决定要在哪里进行转换,您拥有的不仅仅是令牌。现在是你想用什么锤子的问题:-}
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 2016-04-02
  • 1970-01-01
  • 2019-05-11
  • 2014-11-08
  • 2017-12-29
  • 2023-03-09
相关资源
最近更新 更多