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

时间:2018-02-10 21:42:08

标签: regex python-3.x

我试图从凌乱的数据中提取一些文本。它看起来像这样:

  

标题:权力的游戏作者:乔治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)

2 个答案:

答案 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 dimensionstitleauthor子串
  • :\s* - :后跟0 +空白字符
  • (.*?) - 第2组:除了换行符之外的任何0 +字符
  • (?=\s*(?:page dimensions|title|author):|$) - 一个积极的前瞻,需要紧接当前位置右侧的以下模​​式:
    • \s* - 0+ whitespaces
    • (?:page dimensions|title|author):|$ - 两种选择中的任何一种:
      • (?:page dimensions|title|author): - page dimensionstitleauthor后跟:
      • $ - 字符串结束。

答案 1 :(得分:0)

正则表达式(?:(?:title:\s(?P<title>.+?)\s?|author:\s(?P<author>.+?)\s?|page dimensions:\s(?P<dimensions>.+?)\s?)(?=title:|author:|page dimensions:|\.))+

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'}

Code demo