Python 使用正则表达式将文本内容拆分为字典
我有一个遵循这种格式的文本文件 莱斯特·霍尔特(00:00:01):今晚最新消息:一场致命的大规模枪击 在机场。一名持枪歹徒在堡垒的行李认领处开枪 劳德代尔,描述恐怖场景的目击者。沉默的 凶手在人们试图逃跑和躲藏时向他们头部开枪。 今晚,一连串的问题。他为什么这么做?嫌疑犯,一个 乘客的托运行李中有一支枪。新关注 检查站前的机场安全 (00:00:25):今晚还将发布来自美国的最新报道。 情报:弗拉基米尔·普京本人下令努力施加影响 这次选举旨在伤害克林顿并帮助特朗普获胜。怎么回事 当选总统在他的绝密简报后说 (00:00:39):紧急状态:数百万人从一个海岸到另一个海岸 被一场巨大的冬季风暴弄得瘫痪了 (00:00:45):晚间新闻现在开始 我试图将这些信息解析到Python字典中,其中说话人是一个字典,字典中有时间码键,内容是值,由于时间码之前的潜在信息(即第一个引号),我无法一致地拆分,此外,分割字符Python 使用正则表达式将文本内容拆分为字典,python,regex,parsing,dictionary,split,Python,Regex,Parsing,Dictionary,Split,我有一个遵循这种格式的文本文件 莱斯特·霍尔特(00:00:01):今晚最新消息:一场致命的大规模枪击 在机场。一名持枪歹徒在堡垒的行李认领处开枪 劳德代尔,描述恐怖场景的目击者。沉默的 凶手在人们试图逃跑和躲藏时向他们头部开枪。 今晚,一连串的问题。他为什么这么做?嫌疑犯,一个 乘客的托运行李中有一支枪。新关注 检查站前的机场安全 (00:00:25):今晚还将发布来自美国的最新报道。 情报:弗拉基米尔·普京本人下令努力施加影响 这次选举旨在伤害克林顿并帮助特朗普获胜。怎么回事 当选总统在他的
:
也是与时间码本身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新手,所以我将检查表达式并测试它。然而,在第一次运行时,它看起来运行得非常干净。谢谢你们的快速努力,然后他用解释更新了它,太好了,谢谢!你有没有什么工具可以用来解释呢?这很好,请允许我回顾一下这很好,请允许我回顾一下