Python Regex与YAML Front Matter相匹配

Mit*_*civ 5 python regex

我在制作正则表达式以匹配YAML Front Matter方面遇到了麻烦

这是我想要匹配的最重要的事情:

    ---
    name: me
    title: test
    cpu: 1
    ---
Run Code Online (Sandbox Code Playgroud)

这是我认为会起作用的:

re.search( r'^(---)(.*)(---)$', content, re.MULTILINE)
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

MrG*_*mez 7

要使用此正则表达式解压缩当前正在执行的操作:

r'^(---)(.*)(---)$':

  • r:在Python中将其视为字符串文字
  • ^:在一行的开头开始评估
  • (---):解析---为匿名捕获组
  • (.*):解析所有字符(.)非贪婪(*)直到下一个表达式
  • (---): 如上
  • $:在评估一行结束时结束

麻烦的是,当空白存在时,这将失败.你真的在说:找到在一行开头出现的破折号并解析,直到我们发现破折号出现在一行的末尾.此外,您通过()在用于查找YAML前端问题的破折号周围使用括号来创建我认为对正则表达式的有用评估不必要的组.

更好的表达方式是:

r'^\s*---(.*)---\s*$'

其中添加重复组\s*以捕获第一行开头到破折号之间的空白字符,再次在第二组破折号之间添加到该行的末尾,并将所有内容捕获到一个匿名捕获组中,您可以然后用于额外的处理.如果不需要提取前端物质的内容,只需替换(.*)为.*.

考虑re.findall在单个文件中对此正则表达式进行多次评估,并且如上所述,用于re.DOTALL允许点字符匹配新行.