python 拆分所有大写单词的字符串

ADF*_*ADF 1 python regex text

我有一系列格式如下的文本文件:

text = 'COMPANY NAME:   Ruff name of company TYPE OF EVENT: Party NOTIFIED DATE: 1/27/20   COMPANY NAME: Company2/CPT TYPE OF EVENT: Fire NOTIFIED DATE: 1/31/20'
Run Code Online (Sandbox Code Playgroud)

我最终需要将它们放入 pandas 数据框中,其中COMPANY NAME, TYPE OF EVENT,NOTIFIED DATE是列标题和填充行之间的文本。第一步只是弄清楚如何在“:”前面有一个或多个全大写单词的地方分割文本。因此,一些输出如下:

res = ['COMPANY NAME', 'Ruff name of company', 'TYPE OF EVENT', 'PARTY', etc]
Run Code Online (Sandbox Code Playgroud)

我对正则表达式非常陌生,不知道如何让这个匹配发挥作用。我尝试了以下方法:

re.findall('[A-Z]+[A-Z]+[A-Z]', text)
Run Code Online (Sandbox Code Playgroud)

我承认我还差得很远。我还查看了许多其他类似的问题,但未能使它们适应我的用例。

其他帖子:

在Python中使用正则表达式捕获所有连续的全大写单词?

Python正则表达式捕获多大写单词和相邻单词

在 Regex Python 中查找全部大写的行

任何帮助将不胜感激,谢谢!

The*_*ird 5

匹配所有大写字符和冒号后的值:可以以另一个大写字符或数字开头。

一种选择是使用re.findall并使用 2 个捕获组获取值。这将返回 2 个组值的元组。

您可能会使用:

\b([A-Z]+(?:[^\S\r\n]+[A-Z]+)*):[^\S\r\n]+([A-Z0-9].*?(?= [A-Z]|$))
Run Code Online (Sandbox Code Playgroud)

图案将匹配

  • \b字边界
  • (捕获组 1
    • [A-Z]+匹配 1+ 个大写字符
    • (?:[^\S\r\n]+[A-Z]+)*(可选)重复 1+ 个空白字符和 1+ 个大写字符
  • ):关闭第 1 组并匹配冒号
  • [^\S\r\n]+匹配 1 个以上空白字符而不换行
  • (捕获组2
    • [A-Z0-9]匹配大写字符 AZ 或数字
    • .*?尽可能匹配除换行符之外的任何字符
    • (?= [A-Z]|$)正向前视,断言右侧是空格和大写字符 AZ 或字符串末尾。(\Z如果后面不能有换行符则使用)
  • )关闭第 2 组

正则表达式演示| Python演示

例如

import re

regex = r"\b([A-Z]+(?:[^\S\r\n]+[A-Z]+)*):[^\S\r\n]+([A-Z0-9].*?(?= [A-Z]|$))"
test_str = "COMPANY NAME:   Ruff name of company TYPE OF EVENT: Party NOTIFIED DATE: 1/27/20   COMPANY NAME: Company2/CPT TYPE OF EVENT: Fire NOTIFIED DATE: 1/31/20"
print(re.findall(regex, test_str))
Run Code Online (Sandbox Code Playgroud)

输出

[('COMPANY NAME', 'Ruff name of company'), ('TYPE OF EVENT', 'Party'), ('NOTIFIED DATE', '1/27/20  '), ('COMPANY NAME', 'Company2/CPT'), ('TYPE OF EVENT', 'Fire'), ('NOTIFIED DATE', '1/31/20')]
Run Code Online (Sandbox Code Playgroud)

要获取问题中的列表中的所有项目,您还可以使用re.finditer并将组值附加到列表中。查看另一个Python 演示