我需要在双括号上拆分以空格分隔的 TCL 列表...例如...
OUTPUT = """{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}} {{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}"""
这应该解析为...
OUTPUT = ["""{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}}""",
"""{{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}"""]
我试过...
import re
splitter = re.compile('}}\s+{{')
splitter.split(OUTPUT)
但是,这会修剪中间的大括号...
['{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}',
'172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic Item 1}}}']
我不知道如何只在 }} {{
之间的空格上拆分。我知道我可以作弊并手动插入缺失的大括号,但我宁愿找到一种简单的方法来有效地解析它。
有没有一种方法可以使用 re.split
(或其他一些 python 解析框架)来解析 OUTPUT
以获取任意数量的包含 { 的以空格分隔的行{内容在这里}}
?
最佳答案
自从 comp.lang.python 讨论以来,Pyparsing 有了改进,我认为即使是 Cameron Laird 也不会提示使用 pyparsing 的 nestedExpr
方法的解决方案:
OUTPUT = """{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}} {{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic "Item 1"}}}"""
from pyparsing import nestedExpr, originalTextFor
nestedBraces1 = nestedExpr('{', '}')
for nb in nestedBraces1.searchString(OUTPUT):
print nb
nestedBraces2 = originalTextFor(nestedExpr('{', '}'))
for nb in nestedBraces2.searchString(OUTPUT):
print nb
打印:
[[['172.25.50.10:01:01-Ethernet', '172.25.50.10:01:02-Ethernet', ['Traffic', 'Item', '1']]]]
[[['172.25.50.10:01:02-Ethernet', '172.25.50.10:01:01-Ethernet', ['Traffic', '"Item 1"']]]]
['{{172.25.50.10:01:01-Ethernet 172.25.50.10:01:02-Ethernet {Traffic Item 1}}}']
['{{172.25.50.10:01:02-Ethernet 172.25.50.10:01:01-Ethernet {Traffic "Item 1"}}}']
如果您将不得不重新拆分数据以从嵌套大括号中获取单个项目,那么 nestedExpr
的原始嵌套列表输出可能会有更好的帮助(请注意,即使引用字符串在列表中,引用的项目保留为它自己的项目)。但是,如果您真的非常想要包含嵌套大括号的字符串,请使用 nestedBraces2
中显示的带有 originalTextFor
的形式。
关于python - 在 Python 中解析 TCL 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9439124/