将正则表达式转换为另一个

时间:2011-10-19 15:55:12

标签: python regex whitespace transformation tokenize

我必须编写正则表达式来匹配一些可标记的文本,并且添加所有\s*\s+将是很麻烦的,其中空格的数量是无关紧要的或根本不需要。

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

例如:

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

应该返回

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

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

感谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

祝你好运。

答案 1 :(得分:1)

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

你需要一个正则表达式的EBNF,但这很容易。