提问者:小点点

python全大写单词拆分字符串


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

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'

我最终需要将这些数据放到pandas数据框架中,其中公司名称事件类型通知日期是列标题,填充行之间的文本。 第一步就是要弄清楚如何拆分文本中有“:”前面有一个或多个all caps单词的地方。 因此,一些输出如下:

res = ['COMPANY NAME', 'Ruff name of company', 'TYPE OF EVENT', 'PARTY', etc]

我对regex很陌生,不知道如何让这个匹配工作。 我尝试了以下操作:

re.findall('[A-Z]+[A-Z]+[A-Z]', text)

我知道我还没接近。 我也看了很多其他类似的问题,但没能使它们适应我的用例。

其他职位:

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

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

在Regex Python中找到所有大写的行

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


共1个答案

匿名用户

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

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

您可以使用:

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

图案会匹配

  • \b单词边界
  • (捕获组1
    • [A-Z]+匹配1+大写字符
    • (?:[^\s\r\n]+[A-Z]+)*可选重复1+个空格字符和1+个大写字符
    • [A-Z0-9]匹配大写字符A-Z或数字
    • .*?尽可能匹配除换行以外的任何字符
    • (?=[A-Z]$)正向前瞻,断言右侧的内容是空格和大写字符A-Z或字符串的结尾。 (如果不能有以下换行,请使用\z

    Regex演示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))
    

    输出量

    [('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')]
    

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