我需要用双括号分隔空格分隔的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解析框架)来解析包含{{content here}}的任意数量的空格分隔行的OUTPUT
发布于 2012-02-25 07:04:41
您可以修改您的正则表达式以使用正向前视/后视断言,这些断言不会消耗任何字符串:
re.compile('(?<=}})\s+(?={{)')发布于 2012-02-25 07:15:24
自那次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的表单。
发布于 2012-02-25 07:06:19
您可以使用正则表达式来提取列表项值…,而不是拆分
re.findall(r'({{.*?}})(?:\Z|\s+)', OUTPUT)例如:
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}}}']https://stackoverflow.com/questions/9439124
复制相似问题