Python 正则表达式模式仅在中途匹配
我正试图以这样一种方式匹配下面的数据,我可以提取时间码之间的文本Python 正则表达式模式仅在中途匹配,python,regex,Python,Regex,我正试图以这样一种方式匹配下面的数据,我可以提取时间码之间的文本 subs=''' 1 00:00:00,130 --> 00:00:01,640 where you there when it happened? Who else saw you? 2 00:00:01,640 --> 00:00:03,414 This might be your last chance to come clean. Take it or leave it. ''' Regex
subs='''
1
00:00:00,130 --> 00:00:01,640
where you there when it
happened?
Who else saw you?
2
00:00:01,640 --> 00:00:03,414
This might be your last chance to
come clean. Take it or leave it.
'''
Regex=re.compile(r'(\d\d:\d\d\:\d\d,\d\d\d) --> (\d\d:\d\d\:\d\d,\d\d\d)(\n.+)((\n)?).+')
我的正则表达式匹配时间码的第一行和文本的第一行,但只从第二行返回几个字符,而不是整个第二行。我怎样才能让它匹配出时间代码和时间代码之间的所有内容 当前方法的一个可能问题是,在尝试捕获时间戳之间的所有内容时,您没有使用点全部模式。我在DOT ALL模式下进行了
重新搜索
:
subs="""
1 00:00:00,130 --> 00:00:01,640
where you there when it happened?
Who else saw you?
2 00:00:01,640 --> 00:00:03,414
This might be your last chance to
come clean. Take it or leave it. """
match = re.search(r'\d+ \d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d+\s*(.*)\d+ \d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d+', subs, flags=re.DOTALL)
if match:
print match.group(1)
else:
print 'NO MATCH'
这张照片是:
where you there when it happened?
Who else saw you?
当前方法的一个可能问题是,在尝试捕获时间戳之间的所有内容时,您没有使用点全部模式。我在DOT ALL模式下进行了
重新搜索
:
subs="""
1 00:00:00,130 --> 00:00:01,640
where you there when it happened?
Who else saw you?
2 00:00:01,640 --> 00:00:03,414
This might be your last chance to
come clean. Take it or leave it. """
match = re.search(r'\d+ \d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d+\s*(.*)\d+ \d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d+', subs, flags=re.DOTALL)
if match:
print match.group(1)
else:
print 'NO MATCH'
这张照片是:
where you there when it happened?
Who else saw you?
我不确定,但我认为下面的解决方案更适合您的情况…
※使用以下解决方案,您不仅可以提取时间代码之间的文本,还可以将文本连接到时间代码
重新导入
多行文字=\
"""
1 00:00:00,130 --> 00:00:01,640
事情发生时你在哪里?
还有谁看见你了?
2 00:00:01,640 --> 00:00:03,414
这可能是你最后一次机会
坦白说,要么接受,要么放弃。
"""
lines=多行文字分割('\n')
dict={}
当前_键=无;
对于行中的行:
is\u key\u match\u obj=re.search(“([\d\:\,]{12})(\s-->\s)([\d\:\,]{12})”,第行)
如果是关键匹配对象:
当前对象组=是否匹配对象组()
持续
如果当前_键:
如果当前输入dict:
如果不是直线:
dict[当前_键]+='\n'
其他:
dict[当前_键]+=行
其他:
dict[当前_键]=行
打印(dict)
我不确定,但我认为下面的解决方案更适合您的情况…※使用以下解决方案,您不仅可以提取时间代码之间的文本,还可以将文本连接到时间代码
重新导入
多行文字=\
"""
1 00:00:00,130 --> 00:00:01,640
事情发生时你在哪里?
还有谁看见你了?
2 00:00:01,640 --> 00:00:03,414
这可能是你最后一次机会
坦白说,要么接受,要么放弃。
"""
lines=多行文字分割('\n')
dict={}
当前_键=无;
对于行中的行:
is\u key\u match\u obj=re.search(“([\d\:\,]{12})(\s-->\s)([\d\:\,]{12})”,第行)
如果是关键匹配对象:
当前对象组=是否匹配对象组()
持续
如果当前_键:
如果当前输入dict:
如果不是直线:
dict[当前_键]+='\n'
其他:
dict[当前_键]+=行
其他:
dict[当前_键]=行
打印(dict)
您也可以在不使用DOTALL的情况下获得匹配项
在组1中匹配时间码并捕获匹配以下所有不以时间码开头的行(使用负前瞻)
^\d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d+((?:\r?\n(?!\d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d).*)*)
部分地
字符串的开头^
匹配时间码模式\d{2}:\d{2}:\d{2}、\d+-->\d{2}:\d{2}:\d{2}、\d+
Capturegroup 1(
非捕获组(?:
匹配新的\r?\n
负前瞻,不断言时间码(?!\d{2}:\d{2}:\d{2}、\d+-->\d{2}:\d{2}:\d{2}、\d)
匹配除换行符以外的任何字符0+次*
关闭非捕获组并重复0多次)*
关闭捕获组1)
您也可以在不使用DOTALL的情况下获得匹配项 在组1中匹配时间码并捕获匹配以下所有不以时间码开头的行(使用负前瞻)
^\d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d+((?:\r?\n(?!\d{2}:\d{2}:\d{2},\d+ --> \d{2}:\d{2}:\d{2},\d).*)*)
部分地
字符串的开头^
匹配时间码模式\d{2}:\d{2}:\d{2}、\d+-->\d{2}:\d{2}:\d{2}、\d+
Capturegroup 1(
非捕获组(?:
匹配新的\r?\n
负前瞻,不断言时间码(?!\d{2}:\d{2}:\d{2}、\d+-->\d{2}:\d{2}:\d{2}、\d)
匹配除换行符以外的任何字符0+次*
关闭非捕获组并重复0多次)*
关闭捕获组1)
您到底想匹配什么,或者这里的预期输出是什么?@TimBiegeleisen预期输出是这些时间码之间的所有文本。文本可以是两行或三行。我正在寻找一种方法来挑出文本。你到底想匹配什么,或者这里的预期输出是什么?@TimBiegeleisen预期输出是这些时间码之间的所有文本。文本可以是两行或三行。我想找出一种方法来挑出文本。谢谢,我要尝试使用DOTALL。谢谢,我要尝试使用DOTALL。为什么,这里是12?字符数“00:00:00130”是12。为什么,这里是12?字符数“00:00:00130”是12。