我有一系列格式如下的文本文件:
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)
我承认我还差得很远。我还查看了许多其他类似的问题,但未能使它们适应我的用例。
其他帖子:
任何帮助将不胜感激,谢谢!
匹配所有大写字符和冒号后的值:可以以另一个大写字符或数字开头。
一种选择是使用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 组例如
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 演示