我必须编写正则表达式来匹配一些可标记的文本,并且添加所有\s*
和\s+
将是很麻烦的,其中空格的数量是无关紧要的或根本不需要。
我想要的是一个接受正则表达式和分隔符标记列表的函数,然后为我添加空白匹配。
例如:
make_whitespace(regex="foo\.(\w+)\(a\)",delimiters="()[]{},.+-")
应该返回
"foo\s*\.\s*(\s*\w+\s*)\(\s*a\s*\)"
也许已经有更好的方法来实现这一点,而不是破解现有的正则表达式;但我认为使用完整的解析器生成器会有点矫枉过正。我正在使用Python。
感谢。
答案 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,但这很容易。