我有一系列文本文件的格式如下:
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中找到所有大写的行
如有任何帮助将不胜感激,谢谢!
匹配所有大写字符和冒号:
后的值可以以另一个大写字符或数字开头。
一个选项是使用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演示