作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有如下列表:
- launchers
- say hello
- command: echo "hello" | festival --tts
- icon: sayHello.png
- say world
- command: echo "world" | festival --tts
- icon: sayWorld.png
- wait
- command: for ((x = 0; x < 10; ++x)); do :; done
- icon: wait.png
我想将它解析为如下字典:
{
"launchers": {
"say hello": {
"command": "echo \"hello\" | festival --tts",
"icon": "sayHello.png"
}
"say world": {
"command": "echo \"world\" | festival --tts",
"icon": "sayWorld.png"
}
"wait": {
"command": "for ((x = 0; x < 10; ++x)); do :; done",
"icon": "wait.png"
}
}
}
我已经开始编写一些非常手动的代码来计算前导空格(例如 len(line.rstrip()) - len(line.rstrip().lstrip())
),但是我我想知道是否有更明智的方法来解决这个问题。我知道 JSON 可以导入 Python,但这不适合我的目的。那么,如何将文件中的 Markdown 列表解析为 Python 中的字典呢?有没有一种有效的方法来做到这一点?
这是我现在正在玩的一些基本代码:
for line in open("configuration.md", 'r'):
indentation = len(line.rstrip()) - len(line.rstrip().lstrip())
listItem = line.split('-')[1].strip()
listItemSplit = listItem.split(':')
key = listItemSplit[0].strip()
if len(listItemSplit) == 2:
value = listItemSplit[1].strip()
else:
value = ""
print(indentation, key, value)
最佳答案
我会采用更严格的格式并使用堆栈和正则表达式:
import re
line = re.compile(r'( *)- ([^:\n]+)(?:: ([^\n]*))?\n?')
depth = 0
stack = [{}]
for indent, name, value in line.findall(inputtext):
indent = len(indent)
if indent > depth:
assert not stack[-1], 'unexpected indent'
elif indent < depth:
stack.pop()
stack[-1][name] = value or {}
if not value:
# new branch
stack.append(stack[-1][name])
depth = indent
result = stack[0]
这会产生:
>>> import re
>>> inputtext = '''\
... - launchers
... - say hello
... - command: echo "hello" | festival --tts
... - icon: sayHello.png
... - say world
... - command: echo "world" | festival --tts
... - icon: sayWorld.png
... - wait
... - command: for ((x = 0; x < 10; ++x)); do :; done
... - icon: wait.png
... '''
>>> line = re.compile(r'( *)- ([^:\n]+)(?:: ([^\n]*))?\n?')
>>> depth = 0
>>> stack = [{}]
>>> for indent, name, value in line.findall(inputtext):
... indent = len(indent)
... if indent > depth:
... assert not stack[-1], 'unexpected indent'
... elif indent < depth:
... stack.pop()
... stack[-1][name] = value or {}
... if not value:
... # new branch
... stack.append(stack[-1][name])
... depth = indent
...
{'command': 'echo "hello" | festival --tts', 'icon': 'sayHello.png'}
{'command': 'echo "world" | festival --tts', 'icon': 'sayWorld.png'}
>>> result = stack[0]
>>> from pprint import pprint
>>> pprint(result)
{'launchers': {'say hello': {'command': 'echo "hello" | festival --tts',
'icon': 'sayHello.png'},
'say world': {'command': 'echo "world" | festival --tts',
'icon': 'sayWorld.png'},
'wait': {'command': 'for ((x = 0; x < 10; ++x)); do :; done',
'icon': 'wait.png'}}}
来自您输入的文本。
关于python - 如何将 Markdown 列表解析为 Python 中的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25295204/
我是一名优秀的程序员,十分优秀!