免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4842 | 回复: 7
打印 上一主题 下一主题

[文本处理] 正则表达式分组 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-14 23:03 |只看该作者 |倒序浏览
本帖最后由 luofeiyu_cu 于 2013-02-14 23:05 编辑

有个test文本:
mms://cdnmms.cnr.cn/cnr001 中央电台中国之声(可于Totem/VLC/MPlayer播放)
mms://cdnmms.cnr.cn/cnr002 中央电台经济之声(可于Totem/VLC/MPlayer播放)
mms://maclive.881903.com/cr1 商台881(仅限VLC播放)
http://live.hkuradio.com/radio2 凤凰优悦·U Radio音乐台
我准备分成三组,最后一行无法用正则来对付。
第一组:
sed -r 's/([a-z][^ ]*\s)(.+)(\(.+\))/\1/'  tv.txt
mms://cdnmms.cnr.cn/cnr001
mms://cdnmms.cnr.cn/cnr002
mms://maclive.881903.com/cr1
http://live.hkuradio.com/radio2 凤凰优悦·U Radio音乐台
我希望的结果是
mms://cdnmms.cnr.cn/cnr001
mms://cdnmms.cnr.cn/cnr002
mms://maclive.881903.com/cr1
http://live.hkuradio.com/radio2  #请注意这一行,我希望是这样的

第二组:
debian@debian:~$ sed -r 's/([a-z][^ ]*\s)(.+)(\(.+\))/\2/'  tv.txt
中央电台中国之声
中央电台经济之声
商台881
http://live.hkuradio.com/radio2 凤凰优悦·U Radio音乐台
我希望的结果是
中央电台中国之声
中央电台经济之声
商台881
凤凰优悦·U Radio音乐台

第三组
debian@debian:~$ sed -r 's/([a-z][^ ]*\s)(.+)(\(.+\))/\3/'  tv.txt
(可于Totem/VLC/MPlayer播放)
(可于Totem/VLC/MPlayer播放)
(仅限VLC播放)
http://live.hkuradio.com/radio2 凤凰优悦·U Radio音乐台
我希望的结果是:
(可于Totem/VLC/MPlayer播放)
(可于Totem/VLC/MPlayer播放)
(仅限VLC播放)
只有这三行。

请问,可否修改我的正则表达式,达到这样的结果?
这个问题的难处在最后一行的处理,用三个组来匹配每行,那么最后一行,没有  ()括号,它不能分成三组?

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
2 [报告]
发表于 2013-02-14 23:40 |只看该作者
  1. sed -r 's/([a-z][^ ]*\s)(.+)(\(.+\)*)/\1/'  tv.txt
复制代码
试试看吧没测试

论坛徽章:
0
3 [报告]
发表于 2013-02-15 00:03 |只看该作者
不行,测试无法通过。

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
4 [报告]
发表于 2013-02-15 18:11 |只看该作者
回复 1# luofeiyu_cu
  1. sed -r 's/([^ ]*)\s([^()]+)(\(.+\))*/\1/' tv.txt
  2. sed -r 's/([^ ]*)\s([^()]+)(\(.+\))*/\2/' tv.txt
  3. sed -r 's/([^ ]*)\s([^()]+)(\(.+\))*/\3/' tv.txt
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-02-15 19:53 |只看该作者
好,现在变复杂一点,tv.txt文件有变化,某些行的第三组是用  []括起来的,应当如何写正则表达式?
测试文档如下:
mms://live21.gztv.com/gztv_gz 广州台[可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3]
mms://live21.gztv.com/gztv_news 广州新闻台·直播广州[可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3]
mms://live21.gztv.com/gztv_kids 广州少儿台(可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3)
mms://live21.gztv.com/gztv_econ 广州经济台(可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3)
mms://live21.gztv.com/gztv_english 广州英语台·广州生活(可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3,节目以粤语为主)
rtmp://live.zhtv.com/live/zhtv1 珠海-1(可于VLC/MPlayer播放)
rtmp://live.zhtv.com/live/zhtv2 珠海-2
这个正则表达式如何写?

论坛徽章:
6
摩羯座
日期:2013-08-24 10:43:10狮子座
日期:2013-08-25 10:27:06天秤座
日期:2013-09-11 20:28:44午马
日期:2014-09-28 16:06:0015-16赛季CBA联赛之八一
日期:2016-12-19 13:55:0515-16赛季CBA联赛之天津
日期:2016-12-20 14:01:23
6 [报告]
发表于 2013-02-15 21:20 |只看该作者
回复 5# luofeiyu_cu
  1. sed -r 's/([^ ]*)\s([^\x5d\x5b()]*)(\(*\[*.+\]*\)*)/\1/'
  2. sed -r 's/([^ ]*)\s([^\x5d\x5b()]*)(\(*\[*.+\]*\)*)/\2/'
  3. sed -r 's/([^ ]*)\s([^\x5d\x5b()]*)(\(*\[*.+\]*\)*)/\3/'
复制代码

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-16 06:20:00
7 [报告]
发表于 2013-02-15 22:37 |只看该作者
楼主可不可以考虑用sed把文本信息分成3个字段,每个字段直接用空格分开,比如:
  1. [root@node1 work]# cat tv.txt |sed -r "s/\(/ \(/" |sed "s/\[/ \[/" > tv2.txt
复制代码
然后用cut就可以把每个部分分开了
  1. [root@node1 work]# cut -d' ' -f1 tv2.txt
  2. mms://live21.gztv.com/gztv_gz
  3. mms://live21.gztv.com/gztv_news
  4. mms://live21.gztv.com/gztv_kids
  5. mms://live21.gztv.com/gztv_econ
  6. mms://live21.gztv.com/gztv_english
  7. rtmp://live.zhtv.com/live/zhtv1
  8. rtmp://live.zhtv.com/live/zhtv2
  9. [root@node1 work]# cut -d' ' -f2 tv2.txt
  10. 广州台
  11. 广州新闻台·直播广州
  12. 广州少儿台
  13. 广州经济台
  14. 广州英语台·广州生活
  15. 珠海-1
  16. 珠海-2
  17. [root@node1 work]# cut -d' ' -f3 tv2.txt
  18. [可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3]
  19. [可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3]
  20. (可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3)
  21. (可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3)
  22. (可于Totem/VLC/MPlayer播放,记得把高宽比设置成4:3,节目以粤语为主)
  23. (可于VLC/MPlayer播放)
复制代码

论坛徽章:
0
8 [报告]
发表于 2013-02-16 10:58 |只看该作者
本帖最后由 luofeiyu_cu 于 2013-02-16 11:16 编辑

继续深入,我用| 来表达或者,这个逻辑关系,可以通过
sed -r 's/([^ ]*)\s([^\x5d\x5b()]*)((\(.+\))*|(\[.+\])*)/\3/'  tv.txt
写成下面也可以
sed -r 's/([^ ]*)\s([^\x5d\x5b\x28\x29]*)((\(.+\))*|(\[.+\])*)/\3/'  tv.txt
但是,写成这样就不行
sed -r 's/([^ ]*)\s([^\x28\x29\x5d\x5b]*)((\(.+\))*|(\[.+\])*)/\3/'  tv.txt
我仅仅是将符号顺序颠倒了一下而已。
#  sed -r 's/([^ ]*)\s([^\x28\x29\x5d\x5b]*)((\(.+\))*|(\[.+\])*)/\3/'  tv.txt
sed: -e expression #1, char 58: Unmatched [ or [^

如果颠倒成这样,  [^\x28\x5b\x29\x5d] ,会有结果,但是结果不对。
sed -r 's/([^ ]*)\s([^\x28\x5b\x29\x5d]*)((\(.+\))*|(\[.+\])*)/\3/'  tv.txt
请高手仔细解答一下这个问题
[^] 里面的\x5d\x5b\x28\x29  排列问题 ? ()[ ]的排列问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP