从选项列表中提取以特定单词开头并以单词结尾的字符串



我正在尝试从混乱的数据中提取一些文本。它看起来像这样:

标题: 权力的游戏 作者: 乔治· 页面尺寸: 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 dimensionstitleauthor子字符串
  • :s*- 后跟 0+ 空格字符的:
  • (.*?)- 第 2 组:除换行符字符以外的任何 0+ 字符
  • (?=s*(?:page dimensions|title|author):|$)- 积极的前瞻,需要紧邻当前位置右侧的以下模式:
    • s*- 0+ 空格
    • (?:page dimensions|title|author):|$- 两种备选方案之一:
      • (?:page dimensions|title|author):-page dimensionstitleauthor后跟:
      • $- 字符串结尾。

正则表达式(?:(?: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'}

代码演示

最新更新