我正在尝试从混乱的数据中提取一些文本。它看起来像这样:
标题: 权力的游戏 作者: 乔治· 页面尺寸: 210 x 297 毫米。
它们并不总是以相同的顺序排列。我正在使用python和正则表达式。为了解决这个问题,我想我也许可以一个一个地提取它们,但我找不到一种方法来做到这一点。这是我所做的(显示错误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)
您可以使用以下方法从键动态构建正则表达式,因为它们是已知的:
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 演示
"|".join(keys)
部分将在给定keys = ["page dimensions", "title", "author"]
键列表的情况下构建一个page dimensions|title|author
正则表达式,正则表达式看起来像
(page dimensions|title|author):s*(.*?)(?=s*(?:page dimensions|title|author:|$))
请参阅正则表达式演示。
详
(page dimensions|title|author)
- 组 1:page dimensions
、title
或author
子字符串:s*
- 后跟 0+ 空格字符的:
(.*?)
- 第 2 组:除换行符字符以外的任何 0+ 字符(?=s*(?:page dimensions|title|author):|$)
- 积极的前瞻,需要紧邻当前位置右侧的以下模式:s*
- 0+ 空格(?:page dimensions|title|author):|$
- 两种备选方案之一:(?:page dimensions|title|author):
-page dimensions
,title
或author
后跟:
$
- 字符串结尾。
正则表达式:(?:(?:title:s(?P<title>.+?)s?|author:s(?P<author>.+?)s?|page dimensions:s(?P<dimensions>.+?)s?)(?=title:|author:|page dimensions:|.))+
蟒蛇代码:
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'}
代码演示