|
本帖最后由 garypang 于 2018-5-8 18:56 编辑
阅读本帖前建议对正则表达式有一定的了解,本帖不做基础知识普及,只讲解关键点和思路
在我出了两个词组提取资源帖后,不少小伙伴都留言表示希望我出教程帖,也有希望我提取某某词典的词组,秉着授之于鱼不如授之以渔,造福论坛和广大网友的想法,分享下我提取朗文5++词组的全过程,只要跟着我一步一步来,哪怕不懂代码的小白,也能提取出朗文5++,但是要扩展到自己提取其他词典,则需要看懂各个步骤,并举一反三啦.
所用工具:
文本编辑器 notepad++ https://notepad-plus-plus.org/download/ (其他编辑器无法保证本帖提供的正则正常运行)
tidy-html5 https://github.com/htacg/tidy-html5
已编译好版本,直接下载
mdx解压软件MdxExport mdx打包软件 MdxBuilder 论坛有提供下载,
具体步骤
第一步 使用MdxExport 将mdx文件解压成txt文本文件
第二步
用notepad++打开解压后的txt文件,ctrl+H打开替换窗口
替换目标:- .*?(<a name="\w+?"></a><span class="(newline ){0,1}Sense( LDOCEVERSION_new){0,1}" id="\w+?">(<span class="LDOCE5pp_sensefold){0,1}.{0,400}?<span class="REFHWD merge_sense.*?)<!-- End of DIV dictionary-->.*?
复制代码
替换为: 查找模式:正则表达式 勾选匹配新行 保存替换后的文件为hb.txt
讲解:
观察朗文5++词组部分的数据结构
词组部分起始位置标签是类似<span class="newline Sense " id="go__phr__1">,用正则很容易就匹配到,但是末尾闭合标签全是</span> 无法匹配,暂且先匹配至词组所处单词的释义的最末尾 即<!-- End of DIV dictionary-->,做为第一步的筛选,可以去掉很大一部分无用的内容
替换后结果是这样的
第三步
打开 hb.txt
替换目标:- <span( class="(newline ){0,1}Sense( LDOCEVERSION_new){0,1}" id="\w+?">(<span class="LDOCE5pp_sensefold){0,1}.{0,400}?<)span( class="REFHWD merge_sense)
复制代码
替换为: 查找模式:正则表达式
讲解:
这一步的目的是将词组的起始标签比如<span class="newline Sense " id="go__phr__1">改为自定义标签<jia class="newline Sense " id="go__phr__1">,将词组名的起始标签 <span class="REFHWD merge_sense>改为<hwd class="REFHWD merge_sense> 为下一步格式化html做准备
第四步
本帖隐藏的内容win+R或command+R 键入cmd, 打开命令行窗口,命令行切换到下载的tidy.exe所在位置,并将前面处理好的hb.txt也放入此目录 键入 tidy -config config.txt hb.txt > output.txt 回车
等待十到二十分钟不等,可以喝杯咖啡,看看片啥的,完成后会在当前目录生成output.txt文件
等待过程中的窗口
讲解
tidy是个大杀器,能将html格式化的同时自动修复html里的错误,比如我们前面改的自定义标签<jia>和<hwd>,tidy会自动配对这两个标签的闭合标签,发现是</span>而非</jia></hwd>,则会自动将闭合标签改为独一无二的</jia>和</hwd>
这样我们就能轻松通过正则匹配到每个词组的结尾标签位置以及词组名结尾标签位置
第五步
打开 output.txt
替换目标:- .*?(<a name="\w+?"></a>\r\n\s+?<jia class="(newline ){0,1}Sense( LDOCEVERSION_new){0,1}" id="(\w+?)">.+?<hwd class="REFHWD merge_sense[\w\s]*?">(.{1,280}?)</hwd>.*?</jia>).*?
复制代码
替换为:- \5\r\n<link href="LM5style_vanilla.css" rel="stylesheet" type="text/css" /><link href="LM5style.css" rel="stylesheet" type="text/css" /><link href="LM5style_switch.css" rel="stylesheet" type="text/css" /><link href="LM5style_show.css" rel="stylesheet" type="text/css" /><script src="jquery-3.2.1.min.js" charset="utf-8" type="text/javascript"></script><script src="LM5Switch.js" charset="utf-8" type="text/javascript"></script><span class="lm5ppbody"><div class="entry_content"><div class="dictionary"><span class="dictentry"><a name="\4__a"></a><span class="ldoceEntry Entry" id="\4"><span class="frequent Head"><span class="HWD">\5</span></span>\1</span></span></div></div></span>\r\n</>\r\n
复制代码 查找模式:正则表达式 勾选匹配新行
讲解
既然我们能确定所有词组的起始和结束位置,以及词组名的起始和结束位置,那就可以彻底干掉所有没用的内容,只留下有用的词组相关的内容,并将其格式化为mdx要求的格式
替换后效果
到这一步,一部词典的词组提取已经完成了
接下来步骤是针对朗文5++词组的调整和优化,不同词典可能不同.
第一步:
上一步完成后,提取出来的词组名有些是这样的
需要改为abide by something
- (^</>\r\n.+)\r\n\s*?<span class="OBJECT">(.+?)</span>
复制代码 查找模式:正则表达式 需要替换两次,因为有些是两个<span class="OBJECT">(.+?)</span> 比如 take somebody up on something
第二步
去掉词组名里的双空格 三空格
替换目标:- ^(.+?)( | )(.+?)\r\n<link
复制代码
替换为 查找模式:正则表达式 需要替换两次 因为有些词组名中多空格不止出现一次
第三步
愿词典词组中 比如somebody's 使用的是 ’ 而非标准的单引号 ' 作为上标 需要改过来,否则会造成一些词组查不到
替换目标:
替换为:查找模式:普通
第四步
去除词组前面的数字序号
替换目标- \r\n\s*?<span class="sensenum span"( newline="yes"){0,1}>[0-9]+</span>
复制代码
替换为 空
还有进阶的针对查词的灵活性优化,合并原词典后的去重,这些就不说了,每部词典不同,没有通用性,
最后将完成后的文件内容复制到原mdx解压的txt中顶部, 用MdxBuilder 打包即可
只要严格按照我的步骤来,就一定可以完成提取,我是一遍码帖,一遍操作完成了一次提取的.
希望大家踊跃行动起来,提取出自己的词组词典,造福大家!
有问题请私信,正则,mdx等的基础知识普及不回哦.
|
评分
-
8
查看全部评分
-
本帖被以下淘专辑推荐:
- · 工具|主题: 61, 订阅: 28
- · 中医|主题: 7, 订阅: 0
|