通过正则表达式提取泰坦尼克号字幕里的所有台词

这段时间有空就看泰坦尼克号的电影,看了一遍又一遍,以前看不懂,现在是越品越有味道,也羡慕男主角可以活得这么洒脱,也不能说羡慕,只能说每个人有不同的人生吧。然后网上搜一下看看有没有字幕,找了好久也没找到合适的字幕,要么不完整,要么收费,要么数据是错乱的。我的预期合理的字幕是一个有中英文对照版的,然后按照格式一行行的排列,比如一行英文,一行中文,外加一行对应电影的时间

怎么办呢,想到了电影里的字幕,字幕里有数据的,字幕的数据格式也是统一的,自己利用正则提取一下就好了,本来想用javascript来实现,一想又发现js不能操作文件,就用php这个脚本来写吧,开干

首先下载字幕,我在网上下载了一个,点击下载:(点击这个图片,下载后把后缀名改成ssa就可以了)

然后查看文件里的规律,如下:

对于英文和中文有两种格式,对于英语来说,格式如下:

对于中文来说,格式如下:

思路

  可以看到前面部分差不多的,后面的字幕之前有几个字符不一样,例如英文字幕是0000&}结尾的,而中文字幕是3000&}结尾的

  我们可以用两个正则分别提取英语和中文的字幕信息,保存到对应的数组里,数组里的键名为字幕的时间,是个字符串格式,值可以是个数组,分别是对应的字幕

完整代码如下:

<?php
$str = file_get_contents(‘./zimu.ssa‘);                        //load ssa file
function getResult($preg){                                    //get Subtitle interface
    global $str;
    $result = array();
    if(preg_match_all($preg,$str,$match,PREG_OFFSET_CAPTURE)){
        foreach($match[1] as $key => $val){
            $result[trim($val[0],‘,‘)]=$match[2][$key][0];
        }
    }
    return $result;
}

$result_en = getResult(‘/Marked=([^D]*).*?0000&}(.*)/‘);    //获取英文字幕
$result_cn = getResult(‘/Marked=([^D]*).*?3000&}(.*)/‘);    //获取中文字幕

$result = array();
$result_en = array_filter($result_en,function($val,$key) use(&$result,&$result_cn){    //将字幕合并到$result数组里
    if(isset($result_cn[$key])){
        $result[$key] = array($val,$result_cn[$key]);
        unset($result_cn[$key]);
    }else
        return true;
},ARRAY_FILTER_USE_BOTH );

function out($arr,$isarr=1){                                //out inteface
    foreach($arr as $key => $val){
        if($isarr)
            echo $key."<br/>".$val[0]."<br/>".$val[1]."<br/><br/>";
        else
            echo $key."<br/>".$val."<br/><br/>";
    }
}
out($result);                    //输出中文和英文有对应的字幕
out($result_en,0);                //输出只有英文的字幕
out($result_cn,0);                //输出只有中文的字幕
?>

部分输出如下:

OK,It‘s  Perfect~

下一篇贴出完整的字幕

正则里也遇到个问题,理想中[^D]改成[^(?:,D)]的话在getResult里就不需要调用trim()过滤掉末尾的,符号了,但是在php里(?:)不能用,可能php的正则引擎不支持这个功能吧,以后如果再深入研究的话再看看。

原文地址:https://www.cnblogs.com/greatdesert/p/11326476.html

时间: 2024-08-30 17:48:32

通过正则表达式提取泰坦尼克号字幕里的所有台词的相关文章

JMeter中的关联-正则表达式提取(2)

JMeter获取正则表达式中的提取的所有关联值的解决方法: 需求如下: { : "error_no":"0", : "results": : [ : : { : : : "total_earnings":"", : : : "num_page":"5", : : : "retrace_rate_thirty":"0.0061",

asp.net正则表达式提取网页网址、标题、图片实例以及过滤所有HTML标签实例

无论你用什么语言,正则表达式的处理方法都是非常灵活.高效的,尤其是对某些字符串的抓取.过滤方面,更显其优势. 正则表达式的写法通常比较简单,几行短代码便能轻松完成看似很复杂的事情,更值得称赞的是,它的执行效率非常高,运行速度相当快.因此我在项目的开发中,通常把正则表达式作为处理问题的首选方法. 正则表达式的运用,在各种语言里都是相通的,也就是说,当你懂得在PHP中使用正则表达式,那么在任何一种语言中也能轻驾就熟. 这里给出两个asp.net实例. 1.asp.net正则表达式提取网址.标题.图片

正则表达式提取器使用

一.Jmeter关联的方式: Jmeter中关联可以在需要获取数据的请求上 右键-->后置处理器 选择需要的关联方式,如下图有很多种方法可以提取动态变化数据: 二.正则表达式提取器: 1.比如需要提取如下响应文本中的 "<title>百度一下,你就知道</title>" 里面的 "百度一下,你就知道": 2.设置正则表达式提取器: 说明: (1)引用名称:下一个请求要引用的参数名称,如填写title,则可用${title}引用它. (2

使用vba做一个正则表达式提取文本工具

测试中经常会遇到对数据的处理,比如我要删除某些特定数据,数据源是从网页请求中抓取,这时候可能复制下来一大堆内容,其中我们只需要特定的某些部分,笔者通常做法是拷贝到notepad++中处理,结合RegTester工具,但是RegTest需要导出匹配数据,不能直接拷贝,稍微麻烦了一点点......于是想用vba写一个正则表达式提取工具好了,又不花时间.(晕,刚想起来其实会有在线工具的,比如:http://tool.oschina.net/regex/),虽然找到了在线工具,还是说一下自己做的这个吧~

Jmeter之正则表达式提取器应用

说到Jmeter正则表达式提取器的应用,就不得不说到关联.所谓关联,就是把应用中动态变化返回的数据获取到,把它保存为一个参数,提供给后面需要用到的地方进行使用. Jmeter中关联是通过"添加-后置处理器-正则表达式提取器"来获取数据,且注意正则表达式提取器附在需要获取数据的某个采样器之下,数据一般从"查看结果树"的响应数据获取. 一.获取单个数据 举例:获取用户列表的结果如下,需要将"mobilephone":"158****1763

Jmeter关联,正则表达式提取器使用1

 一.Jmeter关联的方式: Jmeter中关联可以在需要获取数据的请求上 右键-->后置处理器 选择需要的关联方式,如下图有很多种方法可以提取动态变化数据: 二.正则表达式提取器: 1.比如需要提取如下响应文本中的 "<title>百度一下,你就知道</title>" 里面的 "百度一下,你就知道": 2.设置正则表达式提取器: 说明: (1)引用名称:下一个请求要引用的参数名称,如填写title,则可用${title}引用它. (

PHP正则表达式提取html超链接中的href地址

用php的正则表达式相关函数,实现提取html超链接<a href="地址"></a>中的地址 <?php $preg='/<a .*?href="(.*?)".*?>/is'; $str ='<a href="链接1">URLNAME</a>文本段1<a href="链接2" target="_blank">URLNAME<

requests+正则表达式提取猫眼电影top100

1 #requests+正则表达式提取猫眼电影top100 2 import requests 3 import re 4 import json 5 from requests.exceptions import RequestException 6 from multiprocessing import Pool 7 8 def get_one_page(url): 9 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64)

接口测试工具-Jmeter使用笔记(五:正则表达式提取器)

(正则表达式提取器是Jmeter关联中的一种)使用场景: 有两个HTTP请求,请求A的返回数据中有一个字段"ABCD",该字段要作为请求B的入参. 1.添加方式 请求A上右键-->后置处理器->正则表达式提取器 2.提取A请求中的taskCode对应的值 为了获取到上图中圈起来的这个值,要配置正则表达式提取器: 说明: (1)引用名称:下一个请求要引用的参数名称,如填写Atask,则可用${Atask}引用它. (2)正则表达式: ():括起来的部分就是要提取的. .:匹配