Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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

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 - Fatal编程技术网

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。