使用正则表达式将文本内容拆分为字典

时间:2017-01-18 20:45:32

标签: python regex parsing dictionary split

我有一个遵循这种格式的文本文件。

  

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} }}

我已尝试使用上面提到的拆分,但它删除了我的时间码变量。

感谢任何想法和指导。

2 个答案:

答案 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 documentationre.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':'今晚也要打破......',....     }