我试图从凌乱的数据中提取一些文本。它看起来像这样:
标题:权力的游戏作者:乔治R页面尺寸:210 x 297毫米。
它们并不总是处于相同的顺序。我正在使用python和regex。为了解决这个问题,我想我可能会逐一提取它们,但我无法想出办法。这是我所做的(显示错误sre_constants.error: nothing to repeat at position 0
):
import re
text = r'title: A Game of Thrones author: George R page dimensions: 210 x 297 mm.'
re.split(r'*(title)(author|page dimensions)$', text)
答案 0 :(得分:1)
您可以使用以下方法从密钥动态构建正则表达式,因为它们是已知的:
import re
s = 'title: A Game of Thrones author: George R page dimensions: 210 x 297 mm.'
keys = ["page dimensions", "title", "author"]
pattern = r"({0}):\s*(.*?)(?=\s*(?:{0}):|$)".format("|".join(keys))
res = dict(re.findall(pattern, s))
print(res)
# => {'author': 'George R', 'page dimensions': '210 x 297 mm.', 'title': 'A Game of Thrones'}
请参阅Python demo
"|".join(keys)
部分将根据page dimensions|title|author
键列表构建keys = ["page dimensions", "title", "author"]
正则表达式,正则表达式将如下所示
(page dimensions|title|author):\s*(.*?)(?=\s*(?:page dimensions|title|author:|$))
请参阅regex demo。
<强>详情
(page dimensions|title|author)
- 第1组:page dimensions
,title
或author
子串:\s*
- :
后跟0 +空白字符(.*?)
- 第2组:除了换行符之外的任何0 +字符(?=\s*(?:page dimensions|title|author):|$)
- 一个积极的前瞻,需要紧接当前位置右侧的以下模式:
\s*
- 0+ whitespaces (?:page dimensions|title|author):|$
- 两种选择中的任何一种:
(?:page dimensions|title|author):
- page dimensions
,title
或author
后跟:
$
- 字符串结束。答案 1 :(得分:0)
Python代码:
import re
text = """title: A Game of Thrones author: George R page dimensions: 210 x 297 mm.
author: Matteo Norzi page dimensions: 210 x 297 mm title: Icaros: A Vision."""
pattern = re.compile(r'(?:(?:title:\s(?P<title>.+?)\s?|author:\s(?P<author>.+?)\s?|page dimensions:\s(?P<dimensions>.+?)\s?)(?=title:|author:|page dimensions:|\.))+')
for m in pattern.finditer(text):
print(m.groupdict())
输出:
{'title': 'A Game of Thrones', 'author': 'George R', 'dimensions': '210 x 297 mm'}
{'title': 'Icaros: A Vision', 'author': 'Matteo Norzi', 'dimensions': '210 x 297 mm'}