【问题标题】:Regex extract header and text separately from a paragraph正则表达式从段落中分别提取标题和文本
【发布时间】:2020-10-15 13:03:54
【问题描述】:

我想将标题和相应的文本分开,用分隔符 colon 与段落分隔。

示例段落, “事故:狐狸跑了过来。一架飞机撞到了头部。结果和结论:我头疼,发烧”

我期望的输出:[('INCIDENTS', 'Quick fox 跑了过来。一架飞机撞到了头部'), ('RESULT AND CONCLUSION', '我头疼,发烧') ]

我正在使用 python 并尝试使用 re.findall(r'([A-Z]+:)(.*?)\.', <paragraph>)。但我没有得到预期的输出。

感谢任何帮助.....

【问题讨论】:

  • re.findall(r'\b([A-Z]+(?:\s+[A-Z]+)*):\s*(.*?)(?=\s*\b([A-Z]+(?:\s+[A-Z]+)*):|$)', text),见regex101.com/r/0rmC38/1

标签: python regex python-re


【解决方案1】:

你可以使用

re.findall(r'\b([A-Z]+(?:\s+[A-Z]+)*):\s*(.*?)(?=\s*\b(?:[A-Z]+(?:\s+[A-Z]+)*):|$)', text)

regex demo

详情

  • \b - 字边界
  • ([A-Z]+(?:\s+[A-Z]+)*) - 第 1 组:一个大写单词,然后是零个或多个以空格分隔的大写单词
  • : - 冒号
  • \s* - 0 个或多个空格
  • (.*?) - 第 2 组:尽可能少的零个或多个字符
  • (?=\s*\b(?:[A-Z]+(?:\s+[A-Z]+)*):|$) - 最多 0 个或多个空格、一个单词边界、一个大写单词,然后是 0 个或多个以空格分隔的大写单词或字符串结尾。

【讨论】:

  • 感谢 Wiktor ..... 按预期工作,但只有一个变化。必须将第三个捕获组设为非捕获组。 \b([A-Z]+(?:\s+[A-Z]+)*):\s*(.*?)(?=\s*\b(?:[A-Z]+(?:\s+[A-Z) ]+)*):|$).
  • 如果事情变成这种模式,还有一件事,段落:“曾经有一个美丽的花园。介绍:有一个美丽的村庄。结论:故事结束” 预期输出: [('FreeText', 'There was a beautiful garden once'), ('INTRODUCTION', 'There was a beautiful village'), ('CONCLUSION': 'End of the story ')] 在这种情况下,您对 Wiktor 有何建议?
  • @Vighnesh.PVicky 您无法匹配 FreeText,因为它在输入文本中丢失。这不可能匹配不存在的文本。
  • FreeText 是我用来表示没有任何标题的文本的键。正如您在上面的示例中看到的那样 “曾经有一个美丽的花园。” 没有任何标题,所以我只是添加了一个标题 FreeText 来表示。
  • @Vighnesh.PVicky 好的,然后尝试r'(\b[A-Z]+(?:\s+[A-Z]+)*:|\A)\s*(.*?)(?=\s*\b(?:[A-Z]+(?:\s+[A-Z]+)*):|$)' 并确保手动添加INTRODUCTION 作为第一个元组第一项。见demo
猜你喜欢
  • 2021-02-05
  • 2014-08-05
  • 2010-09-26
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
相关资源
最近更新 更多