以下代码将帮助我解析与标准模块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
的可读文档。你认识一个人吗?
答案 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
本身,已经结构化似乎更为直截了当。