Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用正则表达式将文本内容拆分为字典_Python_Regex_Parsing_Dictionary_Split - Fatal编程技术网

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

Python 使用正则表达式将文本内容拆分为字典,python,regex,parsing,dictionary,split,Python,Regex,Parsing,Dictionary,Split,我有一个遵循这种格式的文本文件 莱斯特·霍尔特(00:00:01):今晚最新消息:一场致命的大规模枪击 在机场。一名持枪歹徒在堡垒的行李认领处开枪 劳德代尔,描述恐怖场景的目击者。沉默的 凶手在人们试图逃跑和躲藏时向他们头部开枪。 今晚,一连串的问题。他为什么这么做?嫌疑犯,一个 乘客的托运行李中有一支枪。新关注 检查站前的机场安全 (00:00:25):今晚还将发布来自美国的最新报道。 情报:弗拉基米尔·普京本人下令努力施加影响 这次选举旨在伤害克林顿并帮助特朗普获胜。怎么回事 当选总统在他的

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

莱斯特·霍尔特(00:00:01):今晚最新消息:一场致命的大规模枪击 在机场。一名持枪歹徒在堡垒的行李认领处开枪 劳德代尔,描述恐怖场景的目击者。沉默的 凶手在人们试图逃跑和躲藏时向他们头部开枪。 今晚,一连串的问题。他为什么这么做?嫌疑犯,一个 乘客的托运行李中有一支枪。新关注 检查站前的机场安全

(00:00:25):今晚还将发布来自美国的最新报道。 情报:弗拉基米尔·普京本人下令努力施加影响 这次选举旨在伤害克林顿并帮助特朗普获胜。怎么回事 当选总统在他的绝密简报后说

(00:00:39):紧急状态:数百万人从一个海岸到另一个海岸 被一场巨大的冬季风暴弄得瘫痪了

(00:00:45):晚间新闻现在开始

我试图将这些信息解析到Python字典中,其中说话人是一个字典,字典中有时间码键,内容是值,由于时间码之前的潜在信息(即第一个引号),我无法一致地拆分,此外,分割字符
也是与时间码本身
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)
似乎可以正确拆分它,但它会导致我丢失正在拆分的值(timecode),我打算将其用作键。如何正确分割上述内容,获取说话人,然后将时间码作为键,将内容作为值。说话人可能稍后也会出现在文本中,并且应该附加到时间码列表中。/

我的目标输出格式与

{speakers:{'Lester Holt': {'00:00:01':content..., '00:00:0025': content...},
'speaker2':{etc,etc,etc} }}
我试着使用上面提到的拆分,但它删除了我的timecode变量


任何想法和指导都将不胜感激

不要费心于
拆分
。您试图从每行中获取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

不要费心于
拆分
。您试图从每行中获取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

当您需要将消息拆分为带有时间戳的段落时,将其拆分为行是一种浪费
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”:“今晚也要休息……”。。。。
}

当您需要将消息拆分为带有时间戳的段落时,将其拆分为行是一种浪费
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”:“今晚也要休息……”。。。。
}

在尝试正则表达式解决方案之前,你能不能就
):
?@PatrickHaugh你在扼杀正则表达式的乐趣:)也许类似于
([\w\s]*?)(\(\d\d:\d:\d\d\):(*)(?:\n\n$)
我可以,是的,但不必100%确定:在所有txt文件中都不存在,这些文件可能包含在content@Busturdust如果您还不熟悉它们,我建议您查找“捕获组”,这是一种从匹配正则表达式的文本中提取文本的方法。在尝试正则表达式解决方案之前,你能不能就
):
?@PatrickHaugh你在扼杀正则表达式的乐趣:)也许像
([\w\s]*?)(\(\d\d:\d\d:\d\d\):(.*)(?:\n\n$)
我可以,是的,但不必100%确定:在所有txt文件中都不存在,这些文件可能包含在content@Busturdust如果您还不熟悉,我建议您查找“捕获组”,这是一种从与正则表达式匹配的文本中提取文本的方法。谢谢您的回答,因为我是正则表达式的新手,我将复习这个表达式并测试它。然而,在第一次运行时,它看起来运行得非常干净。谢谢你们的快速努力,然后他用解释更新了它,太好了,谢谢!您是否使用了一些工具来生成解释?谢谢您的回答,因为我是regex新手,所以我将检查表达式并测试它。然而,在第一次运行时,它看起来运行得非常干净。谢谢你们的快速努力,然后他用解释更新了它,太好了,谢谢!你有没有什么工具可以用来解释呢?这很好,请允许我回顾一下这很好,请允许我回顾一下