我有一个遵循这种格式的文本文件。
LESTER HOLT(00:00:01):今晚突发新闻:致命的大规模射击 在机场。一名持枪歹徒在Fort堡的行李领取处开火 劳德代尔,目击者描述纯粹恐怖的场面。一个沉默 当他们试图逃跑时,凶手射杀了人们。 今晚,一连串的问题。他为什么这样做?嫌犯,一个 在他的托运行李中带着枪支的乘客。关注的新问题 检查站前的机场安检。
(00:00:25):今晚还要打破美国的新报道 情报:弗拉基米尔普京本人下令努力施加影响 选举旨在伤害克林顿并帮助特朗普获胜。什么的 当选总统在他的绝密通报后说。
(00:00:39):紧急状态:数百万人从海岸到海岸 被大规模的冬季风暴瘫痪。
(00:00:45):NIGHTLY NEWS现在开始。
我正在尝试将这些信息解析为Python字典,其中说话者是字典,字典,其中包含时间码密钥,内容是值,因为潜在的信息,我不能一直分开时间码,(IE第一个引用),以及分裂字符:
也是与时间码本身00:00:00
有关的字符。
尝试根据正则表达式进行拆分。
for line in msg.get_payload().split('\n'):
regex = r'\d{2}:\d{2}:\d{2}'
test = re.split(regex, line)
print(test)
sleep(1)
似乎正常分裂它,但它会导致我失去我正在拆分的值(时间码),我打算将其用作键。如何正确分割上述内容,获取发言人,然后将时间码作为关键字,将内容作为值。有可能他也可能出现在文本的后面,并且应该附加到列表中of timecodes./
我定位的输出格式与
类似{speakers:{'Lester Holt': {'00:00:01':content..., '00:00:0025': content...},
'speaker2':{etc,etc,etc} }}
我已尝试使用上面提到的拆分,但它删除了我的时间码变量。
感谢任何想法和指导。
答案 0 :(得分:2)
不要打扰split
。您试图从每行中获取2-3条信息,因此请尝试以下操作:
for line in msg.get_payload().split('\n'):
match = re.search(r'^\s*([^(]*?)\s*\((\d{2}:\d{2}:\d{2})\):\s*(.*)$', line)
if match:
(speaker, time, message) = match.groups()
如果该行没有,则扬声器将为空字符串。
正则表达式解释:
^ # Start of line
\s* # Drop leading whitespace
([^(]*?) # Capture the speaker if present (non-paren characters)
\s* # Drop whitespace between name and time
\( # Drop literal open paren
(\d{2}:\d{2}:\d{2}) # Capture time
\):\s* # Drop literal close paren, colon and whitespace
(.*) # Capture the rest of the line
$ # End of line
答案 1 :(得分:2)
当您需要在带有时间戳的段落中拆分消息时,在行中拆分消息是一种浪费。如果您只查看the documentation,re.split
可以轻松保存分割的代币。这是我的解决方案:
toks = re.split(r"\((\d\d:\d\d:\d\d)\):", msg.get_payload())[1:]
answer = dict(zip(toks[::2], toks[1::2]))
这会创建一个时间戳和段落的字典。也可以使用相同的方法来分配扬声器。
结果: { ' 00:00:01':'今晚突发新闻:A', ' 00:00:25':'今晚也要打破......',.... }