掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 797|回复: 7

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

[复制链接]

该用户从未签到

发表于 2016-4-30 20:20:47 | 显示全部楼层 |阅读模式
比如以下面add词条为例,希望通过正则表达式提取出例句mp3文件名和英文例句。
$ `$ C9 Q$ F( \% s
5 z, S4 V' g  n) E+ Radd' T: o) D8 x. u: p( x) J
<link type="text/css" rel="stylesheet" href="LDAE5.css"/>8 @# D! q& G" X7 l4 d
<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 ( x4 y/ d( x$ t' Z  T' i% X6 v

: L8 g& a6 P) e( Y" u4 A4 f通过观察可以看到(如下),文件名总是以.mp3结尾,很容易用正则判断出来。但是,例句就很麻烦了,尤其难以判断什么时候例句结束。可能是各种标点,也可能没有标点,而且中间存在的各种<span>也引起很多混乱。& L3 N# y; L2 K# E/ v
$ |. ^8 i4 @& |" s# @
<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>; V& q, `/ f! r* k5 _

* B' N# W! L0 I! }9 p8 b& j目前想到的笨办法就是先尽量把例句中嵌套的<span>删除,然后讲</a>和</span>之间认为是完整例句。但这种方法很容易遗漏和出错。
6 ?  {' w# W. z
+ ~2 [( A5 ~: {恳请指点,如何准确、简单地提出例句文本?非常感谢!

该用户从未签到

发表于 2016-4-30 23:06:32 | 显示全部楼层
本帖最后由 LYX1692 于 2016-5-1 00:13 编辑 , {# V( O% @* y8 E; d( Q. y
4 `. @* ?5 l1 D- ~, V
将每个例句以新行开头,<a>里的MP3,将它变成可显示的文字。如这样:
9 U- A3 \$ m5 Z2 H" h<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>' w6 h. ]  J. `6 L2 }1 |3 w9 `
: A5 X- A( \. ^: M
然后,不需要再用源码处理了,保存为htm网页格式。! N# [9 E% d# U. M4 z" O
如果文件小,直接就用浏览器打开,复制粘贴。+ e7 f0 b9 k2 u9 W) D
如果文件有上百MB,浏览器可能打开困难,就算打开了,复制粘贴也可能出现内存不够等各种问题,取决于你的机器。
& J$ i; S( M/ i% P这里推荐TextForever这么个工具,它可以将大体积的网页转换为纯文本,转换出来的文本就是这样的:
. Q  H6 K+ k. N( c, t㊣【sound://exa/ame/e/p032-000480813.mp3】Continue mixing, then add flour.' d# @9 U' w9 R; O( X' O; w4 R
㊣【sound://exa/ame/9/p032-000063988.mp3】Do you want to add your name to the mailing list?# e8 J+ V* T- a8 m
7 }9 o! @& G: {' W, r: J2 J
这是比较方便的方法。
9 V: ?& y. i) e) l/ u(例句前面我用个“㊣”字,因为这样便于后面操作,^[^㊣]+$,这样就可以将所有不含㊣字符的行数一并清除,剩下有㊣字符的,就是你想要的。)
5 S, g4 h4 x0 ~: F(PS. ^[^㊣]+$,这只是清除不含㊣字符的行内容,而不清除行。如要清楚行,可用 ^[^㊣]+\n。只是个人不喜欢直接删除行,因为我的机器一般,处理大文件时,直接删除不要的行较慢,反倒先清除行内容,再删除重复行比较快。)3 B/ e% P6 h4 w% ~5 j4 d( c

+ R- ^7 s. {: n+ h2 {正则也可以。
/ v$ a8 M1 ]- N3 {如果让我用正则,我就这么做。5 t' \7 {. X: m+ O
1 将<span 替换为 <死笨;将</span>替换为</死笨>  (提前确保文本中本身没有“死”“笨”两个字,看你的文本,应该是纯英文的。或者替换为其他字符也行。如:★☆※◆◇●○,我一般喜欢用一些少见的汉字,如“&#17888;臕&#16384;潴&#17153;&#17780;&#19412;囲媝”,就算是中文,出现的概率很小。当然,为防万一,我也会先检查下)
" X; j# a  X: {7 b4 \7 O2 将 class="example" 替换为 class="㊣"  (提前确保文本中本身没有“㊣”字符。)
. L7 m1 B$ m0 J3 然后正则查找: <死笨[^㊣|>]+>([^死]+)</死笨>% ?: P. u% C9 @2 i  k' ?, c
   替换为:\16 |/ x* E9 V4 i( Y1 }
   (这正则的意思就是,将class非"example"的<span>,去掉标签首尾,只保留标签内容。多查找替换几次,直到没有符合条件的文件即可。)
$ W4 \; W( Y6 K5 w9 ~/ C% {4  最后省下的就是class="example"即class="㊣"的<span>了。
0 |0 i; ~% ^. j8 `$ _5 当然,可能还有其他情况,如里面套的是<b>或者<i>标签等,这就看具体情况了。9 g: _) \# M9 ?6 k1 \( m, _

6 X3 r9 @9 e' H' E(你这文本格式并不复杂,也可省略第1步,从第2步做起,然后第3步查找:<span[^㊣|>]+>([^<]+)</span>,替换为:\1)
: M2 a7 q6 R6 f) e' j(具体操作视你的具体情况而定,主要用到的知识就是如何用正则来表示“非”。[^㊣],就是非㊣的字符。[^㊣|★],就是就是非㊣也非★的字符。)
7 G2 w7 f# X4 F
1 V* S% B0 T+ a4 E# e& x因为你只是要纯文本,我还是推荐一开始的方法,方便很多。

该用户从未签到

 楼主| 发表于 2016-5-1 09:47:13 | 显示全部楼层
LYX1692 发表于 2016-4-30 23:06
+ D& l- ]+ G( `* X9 Y6 O5 w7 _3 a将每个例句以新行开头,里的MP3,将它变成可显示的文字。如这样:
: i) U5 H2 I4 H2 ?4 x㊣【sound://exa/ame/e/p032-000480813. ...

/ `; G( ]: J" A5 \, l* c太好了,大赞!! }! m0 t# e; v& ~% j
1 B6 F2 p; n1 z6 s7 }' B  ~+ E
LYX1692 总是能给出最优方案!' c+ d6 o8 H! y( O5 ?6 `+ k

% s( C1 G+ d; A) }0 C0 T% L把你的帖子汇总,可以出一本优秀的新手教程了!

该用户从未签到

 楼主| 发表于 2016-5-1 10:20:22 | 显示全部楼层
LYX1692 发表于 2016-4-30 23:06) i+ \8 I/ `' O. Z4 p, Z
将每个例句以新行开头,里的MP3,将它变成可显示的文字。如这样:
2 p* N9 h( y$ u2 F$ e㊣【sound://exa/ame/e/p032-000480813. ...
* T: V3 s" B$ f
两个方法都很巧妙!
' H* ]; q' N* @/ q' [' g7 |
+ R0 X% J5 ?5 \; T1 @. Y; ~: K3 |7 G节日快乐!

该用户从未签到

 楼主| 发表于 2016-5-1 22:13:58 | 显示全部楼层
LYX1692 发表于 2016-4-30 23:06
% _! R; u8 J8 e6 O将每个例句以新行开头,里的MP3,将它变成可显示的文字。如这样:- L8 r1 U/ `" I3 [, i7 l, p" K
㊣【sound://exa/ame/e/p032-000480813. ...

; @, P. b' S6 I% ~( g8 i. M在用TextForever遇到个问题:0 O; _5 P3 V' k% h

& Q( {; v- r/ f+ g1 _7 p+ A同样的htm文件,在chrome浏览器中显示很好,就是+ O. B: N$ K* U0 j2 s/ v' o8 A
* s+ o  N2 ^2 T* I1 `% Y0 u
㊣【sound://exa/ame/9/p032-000063988.mp3】Do you want to add your name to the mailing list?" c/ b: i: R7 \- V" B" `
/ b6 k9 S7 g; |9 |. t7 ]) J2 }
这样的格式,例句文本在结尾自动断行,很清晰。
( V! Z$ Q2 G$ o- N# Q0 `
' D/ h6 u8 \9 ^: X. S& a, ]0 u0 s2 H但是,经过TextForever转换的文本,则没有自动断行,例如是下面这样的格式:1 r5 s/ R& p" l
8 }, l! V; b5 H2 c% M& U* H
㊣【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:
- |$ v, ]' s3 u9 `$ G" P
) j) `4 ~/ s( Y$ ~" d' k似乎style="display:block"只在浏览器格式中有换行,在转换TextForever文本时被忽略了,没有换行。' X  O2 Y( B) a( f
  H1 }2 u; j, q2 p4 T
用的TextForever中Html-Txt功能,采用了不同的设置,还是没能解决。再帮我看看好吗,多谢

该用户从未签到

发表于 2016-5-2 07:17:56 | 显示全部楼层
werwer 发表于 2016-5-1 22:13' _& _$ G( K+ m2 l5 m. p' h" M
在用TextForever遇到个问题:
4 q  A$ B! d" I8 T2 O, T4 q. P1 }$ M% p& N/ R8 ?8 H' m  M
同样的htm文件,在chrome浏览器中显示很好,就是

& o/ b$ N3 f6 o) n+ b试试在<span class="example"前面加<br />
. G+ h) j' H# F6 @! e% v再在<span class="sense">前面也加上<br />

该用户从未签到

 楼主| 发表于 2016-5-3 22:15:43 | 显示全部楼层
LYX1692 发表于 2016-5-2 07:17; A) ^' m2 v7 B2 ^) _4 w+ H
试试在

3 s  J& R% p* ~9 f+ t" g好的,谢谢,正在按照这个思路做。
5 k* l) T  _3 j" b/ ?, x" u6 t! U0 a, p* x0 J) H5 |% V3 Y
不过Aboboo突然出了问题,txt批量导入句子,总是说指定文件不存在,之前可以导入的txt也不行了。
- F" u8 Z: @5 k$ B0 v. a1 ~% ?  B# U. `" p( P# N) D# u0 q
唉,心好累
  • TA的每日心情
    开心
    2019-6-27 08:03
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2016-5-4 09:52:34 | 显示全部楼层
    不会用正则表达式 但可以分步提取
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2025-5-7 08:15 , Processed in 0.021520 second(s), 21 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表