REGEX - 由`sre_parse`完成的模式解析的字符串版本

时间:2014-01-27 23:50:17

标签: python regex parsing

以下代码将帮助我解析与标准模块re一起使用的模式。

import sre_parse

pattern = r"(?P<TEST>test)\s+\w*(?P=TEST)|abcde"

parsedpattern = sre_parse.parse(pattern)
parsedpattern.dump()

在终端中,这提供了一个易于解析的文本。

branch 
  subpattern 1 
    literal 116 
    literal 101 
    literal 115 
    literal 116 
  max_repeat 1 2147483647 
    in 
      category category_space
  max_repeat 0 2147483647 
    in 
      category category_word
  groupref 1 
or
  literal 97 
  literal 98 
  literal 99 
  literal 100 
  literal 101 

有没有一种简单的方法可以将此文本作为字符串变量?由于模块dump,我可以使用方法inspect.getsourcelines的代码,该代码通过将sre_parse.SubPattern应用于inspect来提供。但是,如果有一个解决方案,我会跳出一个更直接的解决方案。

PS:我还没有找到任何关于模块sre_parse的可读文档。你认识一个人吗?

1 个答案:

答案 0 :(得分:3)

您可以随时使用sys.stdout并将其重定向到某个变量:

import sre_parse
import sys

class PseudoStdout:
    def __init__(self):
        self.contents = ''
    def __enter__(self): # this and __exit__ are for context management
        self.old_stdout = sys.stdout
        sys.stdout = self
    def __exit__(self, type_, value, traceback):
        sys.stdout = self.old_stdout
    def write(self, text): # magic method that makes it behave like a file
        self.contents += text

pattern = r"(?P<TEST>test)\s+\w*(?P=TEST)|abcde"
parsedpattern = sre_parse.parse(pattern)

ps = PseudoStdout()
with ps:
    parsedpattern.dump()

print(repr(ps.contents))

结果:

'branch \n  subpattern 1 \n    literal 116 \n    literal 101 \n    literal 115 \n    literal 116 \n  max_repeat 1 65535 \n    in \n      category category_space\n  max_repeat 0 65535 \n    in \n      category category_word\n  groupref 1 \nor\n  literal 97 \n  literal 98 \n  literal 99 \n  literal 100 \n  literal 101 \n'

但是,通过parsedpattern本身,已经结构化似乎更为直截了当。