Python Regex para que coincida con la materia delantera YAML

Tengo problemas para crear una expresión regular que coincida con la materia delantera de YAML

Este es el asunto del frente que estaba tratando de igualar:

--- name: me title: test cpu: 1 --- 

Esto es lo que pensé que funcionaría:

 re.search( r'^(---)(.*)(---)$', content, re.MULTILINE) 

Cualquier ayuda sería muy apreciada.

Para descomprimir lo que está haciendo actualmente con esta expresión regular:

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

  • r : Trate esto como una cadena literal en Python
  • ^ : Iniciar la evaluación al principio de una línea
  • (---) : Parse --- en un grupo de captura anónimo
  • (.*) : Analiza todos los caracteres ( . ) Sin codicia ( * ) hasta la siguiente expresión
  • (---) : Como arriba
  • $ : Fin en la evaluación del final de una línea

El problema es que esto fallará cuando haya espacios en blanco. Literalmente estás diciendo: encuentra guiones que aparecen al principio de una línea y analiza hasta que encontremos guiones que aparezcan al final de una línea. Además, está creando grupos que, en mi opinión, no son necesarios para la evaluación útil de su expresión regular, utilizando paréntesis () alrededor de los guiones utilizados para encontrar la materia delantera de YAML.

Una mejor expresión sería:

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

Lo que agrega el grupo repetitivo \s* para capturar caracteres de espacios en blanco entre el comienzo de la primera línea hasta los guiones, agrega esto nuevamente entre el segundo grupo de guiones al final de esa línea, y captura todo entre un solo grupo de captura anónimo que luego puede utilizar para el procesamiento adicional. Si no desea extraer el contenido de la parte frontal, simplemente reemplace (.*) Con .* .

Considere re.findall para múltiples evaluaciones de esta expresión regular en un solo archivo, y como se mencionó, use re.DOTALL para permitir que el carácter de punto coincida con las nuevas líneas.

He usado algo como esta expresión regular, re.findall('^---[\s\S]+?---', text) :

 def extractFrontMatter(markdown): md = open(markdown, 'r') text = md.read() md.close() # Returns first yaml content, `--- yaml frontmatter ---` from the .md file # http://regexr.com/3f5la # https://stackoverflow.com/questions/2503413/regular-expression-to-stop-at-first-match match = re.findall('^---[\s\S]+?---', text) if match: # Strips `---` to create a valid yaml object ymd = match[0].replace('---', '') try: return yaml.load(ymd) except yaml.YAMLError as exc: print exc 

También he encontrado python-frontmatter , que tiene algunas funciones auxiliares adicionales:

 import frontmatter post = frontmatter.load('/path/to-markdown.md') print post.metadata, 'meta' print post.keys(), 'keys'