使用正则表达式提取YAML标头

时间:2016-06-26 14:20:51

标签: python regex python-3.x

我有一个带有YAML标题的文件,这是一个以---开头的文件,有---。类似的东西:

---
title: Quantes monedes de cèntim caben a un cercle?
author: Dan Meyer
date: 2013-08-26
abstract: Quantes monedes de cèntim caben a un cercle?
tags: 3-acts
continguts: àrea, cercle, ajustament de corbes, extrapolació, funció quadràtica, representació de funcions, 
relatedto: []
lang: ca
---


[![Penny circle](./shot.png)](http://threeacts.mrmeyer.com/pennycircle/)

Quantes monedes de cèntim caben a un cercle?

## Recursos ##

1. [Proposta original d'en Dan Meyer](http://blog.mrmeyer.com/2013/makeover-penny-circle/) ([localment](./media/activitats/meyer-penny-circle/dy_dan » Blog Archive » [Makeover] Penny Circle.htm))
1. L'[activitat en tres actes](http://threeacts.mrmeyer.com/pennycircle/) d'en Dan Meyer ([localment](./media/activitats/meyer-penny-circle/pennycircle.zip))
1. [Activitat a Desmos](https://teacher.desmos.com/pennycircle)

我想在python3中使用正则表达式来拆分内容:YAML内容和文件的其余部分。在我的例子中,第一部分是这个

---
title: Quantes monedes de cèntim caben a un cercle?
author: Dan Meyer
date: 2013-08-26
abstract: Quantes monedes de cèntim caben a un cercle?
tags: 3-acts
continguts: àrea, cercle, ajustament de corbes, extrapolació, funció quadràtica, representació de funcions, 
relatedto: []
lang: ca
---

第二个:

[![Penny circle](./shot.png)](http://threeacts.mrmeyer.com/pennycircle/)

Quantes monedes de cèntim caben a un cercle?

## Recursos ##

1. [Proposta original d'en Dan Meyer](http://blog.mrmeyer.com/2013/makeover-penny-circle/) ([localment](./media/activitats/meyer-penny-circle/dy_dan » Blog Archive » [Makeover] Penny Circle.htm))
1. L'[activitat en tres actes](http://threeacts.mrmeyer.com/pennycircle/) d'en Dan Meyer ([localment](./media/activitats/meyer-penny-circle/pennycircle.zip))
1. [Activitat a Desmos](https://teacher.desmos.com/pennycircle)

我使用此re:p = re.compile('---\n(.*?)\n---\n(.*?)')但它不起作用。

2 个答案:

答案 0 :(得分:2)

除非您设置DOTALL flag

,否则

.与换行符不匹配

p = re.compile('---\n(.*?)\n---\n(.*)', flags=re.DOTALL)

请注意,我从第二个?中删除了*;你需要在第二个---之后的所有内容,而不仅仅是前一个1个字符。

来自文档:

  

re.S
  re.DOTALL
  使'.'特殊字符与任何字符匹配,包括换行符;如果没有此标记,'.'将匹配除换行符之外的任何内容。

但是,您可以在---\n行分割文字;将其限制为两个分割:

yaml, text = text.split('---\n', 2)[1:]

这会将您的文本拆分为前缀,YAML部分和其他部分。使用[1:]忽略前缀。

演示:

>>> import re
>>> p = re.compile('---\n(.*?)\n---\n(.*)', flags=re.DOTALL)
>>> p.search(text).groups()
('title: Quantes monedes de cèntim caben a un cercle?\nauthor: Dan Meyer\ndate: 2013-08-26\nabstract: Quantes monedes de cèntim caben a un cercle?\ntags: 3-acts\ncontinguts: àrea, cercle, ajustament de corbes, extrapolació, funció quadràtica, representació de funcions, \nrelatedto: []\nlang: ca', "\n\n[![Penny circle](./shot.png)](http://threeacts.mrmeyer.com/pennycircle/)\n\nQuantes monedes de cèntim caben a un cercle?\n\n## Recursos ##\n\n1. [Proposta original d'en Dan Meyer](http://blog.mrmeyer.com/2013/makeover-penny-circle/) ([localment](./media/activitats/meyer-penny-circle/dy_dan » Blog Archive » [Makeover] Penny Circle.htm))\n1. L'[activitat en tres actes](http://threeacts.mrmeyer.com/pennycircle/) d'en Dan Meyer ([localment](./media/activitats/meyer-penny-circle/pennycircle.zip))\n1. [Activitat a Desmos](https://teacher.desmos.com/pennycircle)\n")
>>> text.split('---\n', 2)[1:]
['title: Quantes monedes de cèntim caben a un cercle?\nauthor: Dan Meyer\ndate: 2013-08-26\nabstract: Quantes monedes de cèntim caben a un cercle?\ntags: 3-acts\ncontinguts: àrea, cercle, ajustament de corbes, extrapolació, funció quadràtica, representació de funcions, \nrelatedto: []\nlang: ca\n', "\n\n[![Penny circle](./shot.png)](http://threeacts.mrmeyer.com/pennycircle/)\n\nQuantes monedes de cèntim caben a un cercle?\n\n## Recursos ##\n\n1. [Proposta original d'en Dan Meyer](http://blog.mrmeyer.com/2013/makeover-penny-circle/) ([localment](./media/activitats/meyer-penny-circle/dy_dan » Blog Archive » [Makeover] Penny Circle.htm))\n1. L'[activitat en tres actes](http://threeacts.mrmeyer.com/pennycircle/) d'en Dan Meyer ([localment](./media/activitats/meyer-penny-circle/pennycircle.zip))\n1. [Activitat a Desmos](https://teacher.desmos.com/pennycircle)\n"]

答案 1 :(得分:2)

对于这样一个简单的分隔符,你并不需要正则表达式。给出测试文件......

---
This is the first part
---
This is the second part

......像......一样简单......

>>> s = open('testfile').read()
>>> _, part1, part2 = s.split('---\n')
>>> print part1
This is the first part

>>> print part2
This is the second part

......应该足够了。