查看: 313|回复: 7
打印 上一主题 下一主题

[求助] 请教一个正则表达式的问题,用来判断例句结尾。

[复制链接]

该用户从未签到

2

主题

22

回帖

139

积分

童生

Rank: 2

积分
139
跳转到指定楼层
1
发表于 2016-4-30 20:20:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如以下面add词条为例,希望通过正则表达式提取出例句mp3文件名和英文例句。

add
<link type="text/css" rel="stylesheet" href="LDAE5.css"/>
<div id="LDAE5_add_1"><span class="entry" id="add"><span class="entryhead"><span class="hwd">add</span><span class="hyphenation frequent">add</span> <proncodes><span class="neutral"> /</span><span class="pron">&#230;d</span><span class="neutral">/</span></proncodes><span class="level"> ●●●</span><span class="pos"> verb</span><span class="gram"> [transitive]</span> <a class="jp-play" href="sound://hwd/ame/a/ad1.mp3"><img src="img/spkr_b.png"></a><span class="buttons"><a class="popup-button" href="entry://@etymologies_u2fc098491a42200a.-5b7eb3a7.13b877f5061.-6775">Word Origin</a> <a class="popup-button" href="entry://@verbs_u2fc098491a42200a.-5b7eb3a7.13b877f5061.-6775">Verb Table</a> <a class="popup-button" href="entry://@collocations_add">Collocations</a> <a class="popup-button" href="entry://@thesaurus_add">Thesaurus</a> </span></span><span class="sense"><span class="sensenum">1</span><span class="def">to put something with something else, or with a group of other things</span><span class="neutral">: </span><span class="example"><a class="jp-play" href="sound://exa/ame/e/p032-000480813.mp3"><img src="img/spkr_g.png"></a>&#160;Continue mixing, then add flour.</span><span class="example"><a class="jp-play" href="sound://exa/ame/9/p032-000063988.mp3"><img src="img/spkr_g.png"></a>&#160;Do you want to <span class="colloinexa">add</span> your name <span class="colloinexa">to</span> the mailing list?</span></span><span class="sense"><span class="sensenum">2</span><span cat="math" class="topic"><span class="topic">math</span></span><span class="def"> to put numbers or amounts together and then calculate the total</span><span class="neutral">: </span><span class="example"><a class="jp-play" href="sound://exa/ame/a/p032-000064001.mp3"><img src="img/spkr_g.png"></a>&#160;If you add 5 and 3, you get 8.</span><span class="example"><a class="jp-play" href="sound://exa/ame/5/p032-000480814.mp3"><img src="img/spkr_g.png"></a>&#160;The interest will be added to your savings every six months.</span></span><span class="sense"><span class="sensenum">3</span><span class="def">to say something extra about what you have just said</span><span class="neutral">: </span><span class="example"><a class="jp-play" href="sound://exa/ame/1/p032-000064004.mp3"><img src="img/spkr_g.png"></a>&#160;The judge <span class="colloinexa">added that</span> this case was one of the worst she had ever tried.</span><span class="thesbox display" type="auto" id="add_s1"><span class="heading">THESAURUS</span><span class="section last"><span class="exponent inline" chosen="u2fc098491a42200a.-5b7eb3a7.13b877f5061.-675b"><span class="exp display">say</span></span><span class="exponent inline" chosen="u2fc098491a42200a.-5b7eb3a7.13b877f5061.-6759"><span class="neutral">, </span><span class="exp display">mention</span></span><span class="exponent inline" chosen="u2fc098491a42200a.-5b7eb3a7.13b877f5061.-6757"><span class="neutral">, </span><span class="exp display">state</span></span><span class="thesref"><span class="thesaurus">&#9658;</span> see <span class="thesaurus">thesaurus</span> at <a goto="say_1+say_1_s1"><span class="refhwd">say</span><span

通过观察可以看到(如下),文件名总是以.mp3结尾,很容易用正则判断出来。但是,例句就很麻烦了,尤其难以判断什么时候例句结束。可能是各种标点,也可能没有标点,而且中间存在的各种<span>也引起很多混乱。

<span class="example"><a class="jp-play" href="sound://exa/ame/e/p032-000480813.mp3"><img src="img/spkr_g.png"></a>&#160;Continue mixing, then add flour.</span><span class="example"><a class="jp-play" href="sound://exa/ame/9/p032-000063988.mp3"><img src="img/spkr_g.png"></a>&#160;Do you want to <span class="colloinexa">add</span> your name <span class="colloinexa">to</span> the mailing list?</span></span>

目前想到的笨办法就是先尽量把例句中嵌套的<span>删除,然后讲</a>和</span>之间认为是完整例句。但这种方法很容易遗漏和出错。

恳请指点,如何准确、简单地提出例句文本?非常感谢!

该用户从未签到

40

主题

177

回帖

1628

积分

版主

Rank: 10Rank: 10Rank: 10

积分
1628

灌水大神章小蜜蜂章笑傲江湖章管理组专用章

2
发表于 2016-4-30 23:06:32 | 只看该作者
本帖最后由 LYX1692 于 2016-5-1 00:13 编辑

将每个例句以新行开头,<a>里的MP3,将它变成可显示的文字。如这样:
<span class="example" style="display:block">㊣【sound://exa/ame/e/p032-000480813.mp3】 Continue mixing, then add flour.</span><span class="example" style="display:block">㊣【sound://exa/ame/9/p032-000063988.mp3】 Do you want to <span class="colloinexa">add</span> your name <span class="colloinexa">to</span> the mailing list?</span></span>

然后,不需要再用源码处理了,保存为htm网页格式。
如果文件小,直接就用浏览器打开,复制粘贴。
如果文件有上百MB,浏览器可能打开困难,就算打开了,复制粘贴也可能出现内存不够等各种问题,取决于你的机器。
这里推荐TextForever这么个工具,它可以将大体积的网页转换为纯文本,转换出来的文本就是这样的:
㊣【sound://exa/ame/e/p032-000480813.mp3】Continue mixing, then add flour.
㊣【sound://exa/ame/9/p032-000063988.mp3】Do you want to add your name to the mailing list?

这是比较方便的方法。
(例句前面我用个“㊣”字,因为这样便于后面操作,^[^㊣]+$,这样就可以将所有不含㊣字符的行数一并清除,剩下有㊣字符的,就是你想要的。)
(PS. ^[^㊣]+$,这只是清除不含㊣字符的行内容,而不清除行。如要清楚行,可用 ^[^㊣]+\n。只是个人不喜欢直接删除行,因为我的机器一般,处理大文件时,直接删除不要的行较慢,反倒先清除行内容,再删除重复行比较快。)

正则也可以。
如果让我用正则,我就这么做。
1 将<span 替换为 <死笨;将</span>替换为</死笨>  (提前确保文本中本身没有“死”“笨”两个字,看你的文本,应该是纯英文的。或者替换为其他字符也行。如:★☆※◆◇●○,我一般喜欢用一些少见的汉字,如“&#17888;臕&#16384;潴&#17153;&#17780;&#19412;囲媝”,就算是中文,出现的概率很小。当然,为防万一,我也会先检查下)
2 将 class="example" 替换为 class="㊣"  (提前确保文本中本身没有“㊣”字符。)
3 然后正则查找: <死笨[^㊣|>]+>([^死]+)</死笨>
   替换为:\1
   (这正则的意思就是,将class非"example"的<span>,去掉标签首尾,只保留标签内容。多查找替换几次,直到没有符合条件的文件即可。)
4  最后省下的就是class="example"即class="㊣"的<span>了。
5 当然,可能还有其他情况,如里面套的是<b>或者<i>标签等,这就看具体情况了。

(你这文本格式并不复杂,也可省略第1步,从第2步做起,然后第3步查找:<span[^㊣|>]+>([^<]+)</span>,替换为:\1)
(具体操作视你的具体情况而定,主要用到的知识就是如何用正则来表示“非”。[^㊣],就是非㊣的字符。[^㊣|★],就是就是非㊣也非★的字符。)

因为你只是要纯文本,我还是推荐一开始的方法,方便很多。

该用户从未签到

2

主题

22

回帖

139

积分

童生

Rank: 2

积分
139
3
 楼主| 发表于 2016-5-1 09:47:13 | 只看该作者
LYX1692 发表于 2016-4-30 23:06
将每个例句以新行开头,里的MP3,将它变成可显示的文字。如这样:
㊣【sound://exa/ame/e/p032-000480813. ...

太好了,大赞!

LYX1692 总是能给出最优方案!

把你的帖子汇总,可以出一本优秀的新手教程了!

该用户从未签到

2

主题

22

回帖

139

积分

童生

Rank: 2

积分
139
4
 楼主| 发表于 2016-5-1 10:20:22 | 只看该作者
LYX1692 发表于 2016-4-30 23:06
将每个例句以新行开头,里的MP3,将它变成可显示的文字。如这样:
㊣【sound://exa/ame/e/p032-000480813. ...

两个方法都很巧妙!

节日快乐!

该用户从未签到

2

主题

22

回帖

139

积分

童生

Rank: 2

积分
139
5
 楼主| 发表于 2016-5-1 22:13:58 | 只看该作者
LYX1692 发表于 2016-4-30 23:06
将每个例句以新行开头,里的MP3,将它变成可显示的文字。如这样:
㊣【sound://exa/ame/e/p032-000480813. ...

在用TextForever遇到个问题:

同样的htm文件,在chrome浏览器中显示很好,就是

㊣【sound://exa/ame/9/p032-000063988.mp3】Do you want to add your name to the mailing list?

这样的格式,例句文本在结尾自动断行,很清晰。

但是,经过TextForever转换的文本,则没有自动断行,例如是下面这样的格式:

㊣【sound://exa/ame/9/p032-000063988.mp3】Do you want to add your name to the mailing list?2math to put numbers or amounts together and then calculate the total:

似乎style="display:block"只在浏览器格式中有换行,在转换TextForever文本时被忽略了,没有换行。

用的TextForever中Html-Txt功能,采用了不同的设置,还是没能解决。再帮我看看好吗,多谢

该用户从未签到

40

主题

177

回帖

1628

积分

版主

Rank: 10Rank: 10Rank: 10

积分
1628

灌水大神章小蜜蜂章笑傲江湖章管理组专用章

6
发表于 2016-5-2 07:17:56 | 只看该作者
werwer 发表于 2016-5-1 22:13
在用TextForever遇到个问题:

同样的htm文件,在chrome浏览器中显示很好,就是

试试在<span class="example"前面加<br />
再在<span class="sense">前面也加上<br />

该用户从未签到

2

主题

22

回帖

139

积分

童生

Rank: 2

积分
139
7
 楼主| 发表于 2016-5-3 22:15:43 | 只看该作者

好的,谢谢,正在按照这个思路做。

不过Aboboo突然出了问题,txt批量导入句子,总是说指定文件不存在,之前可以导入的txt也不行了。

唉,心好累
  • TA的每日心情
    开心
    2019-6-27 08:03
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    40

    主题

    464

    回帖

    5430

    积分

    会元

    Rank: 7Rank: 7Rank: 7

    积分
    5430

    灌水大神章

    8
    发表于 2016-5-4 09:52:34 | 只看该作者
    不会用正则表达式 但可以分步提取