首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中解析TCL列表

在Python中解析TCL列表
EN

Stack Overflow用户
提问于 2012-02-25 06:47:33
回答 3查看 1.5K关注 0票数 5

我需要用双括号分隔空格分隔的TCL列表...例如..。

代码语言:javascript
复制
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}}}"""

这应该解析成..。

代码语言:javascript
复制
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}}}"""]

我试过了..。

代码语言:javascript
复制
import re
splitter = re.compile('}}\s+{{')
splitter.split(OUTPUT)

然而,这修剪了中间的花括号...

代码语言:javascript
复制
['{{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解析框架)来解析包含{{content here}}的任意数量的空格分隔行的OUTPUT

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-25 07:04:41

您可以修改您的正则表达式以使用正向前视/后视断言,这些断言不会消耗任何字符串:

代码语言:javascript
复制
re.compile('(?<=}})\s+(?={{)')
票数 3
EN

Stack Overflow用户

发布于 2012-02-25 07:15:24

自那次comp.lang.python讨论以来,Pyparsing已经得到了改进,我认为即使是Cameron Laird也不会抱怨使用pyparsing的nestedExpr方法的解决方案:

代码语言:javascript
复制
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

打印:

代码语言:javascript
复制
[[['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的表单。

票数 4
EN

Stack Overflow用户

发布于 2012-02-25 07:06:19

您可以使用正则表达式来提取列表项值…,而不是拆分

代码语言:javascript
复制
re.findall(r'({{.*?}})(?:\Z|\s+)', OUTPUT)

例如:

代码语言:javascript
复制
In [30]: regex = re.compile(r'({{.*?}})(?:\Z|\s+)')

In [31]: regex.findall(OUTPUT)
Out[31]: 
['{{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}}}']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9439124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档