Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在nestedExpr中保留空白_Python_Macros_Wiki_Pyparsing - Fatal编程技术网

Python 如何在nestedExpr中保留空白

Python 如何在nestedExpr中保留空白,python,macros,wiki,pyparsing,Python,Macros,Wiki,Pyparsing,我有这样的维基文本 data = """ {{hello}} {{hello world}} {{hello much { }} {{a {{b}}}} {{a td { } {{inner}} }} “”“ 我想提取其中的宏 宏是一个包含在{{和} 所以我试着使用nestedExpr from pyparsing import * import pprint def getMacroCandidates(txt): candidates = [] def nes

我有这样的维基文本

data = """
{{hello}}

{{hello world}}
{{hello much { }}
{{a {{b}}}}

{{a

td {

}
{{inner}}
}}
“”“

我想提取其中的宏 宏是一个包含在
{{
}

所以我试着使用nestedExpr

from pyparsing import *
import pprint

def getMacroCandidates(txt):

    candidates = []

    def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()):
        if opener == closer:
            raise ValueError("opening and closing strings cannot be the same")
        if content is None:
            if isinstance(opener,str) and isinstance(closer,str):
                if ignoreExpr is not None:
                    content = (Combine(OneOrMore(~ignoreExpr + 
                                    ~Literal(opener) + ~Literal(closer) +
                                    CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1))
                                ).setParseAction(lambda t:t[0]))
        ret = Forward()
        ret <<= Group( opener + ZeroOrMore( ignoreExpr | ret | content ) + closer )

        ret.setName('nested %s%s expression' % (opener,closer))
        return ret

    # use {}'s for nested lists
    macro = nestedExpr("{{", "}}")
    # print(( (nestedItems+stringEnd).parseString(data).asList() ))
    for toks, preloc, nextloc in macro.scanString(data):
        print(toks)
    return candidates

data = """
{{hello}}

{{hello world}}
{{hello much { }}
{{a {{b}}}}

{{a

td {

}
{{inner}}
}}
"""

getMacroCandidates(data)
提前感谢您

您可以更换

data = """
{{hello}}

{{hello world}}
{{hello much { }}
{{a {{b}}}}

{{a

td {

}
{{inner}}
}}
"""

import shlex
data1= data.replace("{{",'"')
data2 = data1.replace("}}",'"')
data3=   data2.replace("}"," ")
data4=   data3.replace("{"," ")
data5= ' '.join(data4.split())
print(shlex.split(data5.replace("\n"," ")))
输出

这将返回所有带大括号和空格的令牌,并删除额外的行空间

 ['hello', 'hello world', 'hello much ', 'a b', 'a td inner ']

PS:这可以用于单个表达式,多个表达式用于可读性

要获取解析表达式的原始文本,您可以使用
originalTextFor
helper:
macro=originalTextFor(nestedExpr({,“}”)
。这将保留所有空格、换行符等。
 ['hello', 'hello world', 'hello much ', 'a b', 'a td inner ']