免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求一个正则表达式 [复制链接]

论坛徽章:
1
狮子座
日期:2014-12-30 09:41:13
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-02 00:16 |只看该作者 |倒序浏览
本帖最后由 abbr 于 2015-05-02 00:17 编辑

以某字符串开头,某字符串结尾的文本序列。比如下面的排比句:
关爱是一个眼神,给学生无声的祝福;
关爱是一缕青风,给学生身心的舒畅;
关爱是一场春雨,给学生心田的滋润;
关爱是一句问侯,给学生春天的温暖


想把中间:

一个眼神
一缕青风
一场春雨
一句问侯


提取出来。
即以”关爱是“开头,”,给学生"结尾,这样的规律。
找了好久,也去看了正则表达式的书,还是没找到答案。

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
2 [报告]
发表于 2015-05-02 00:49 |只看该作者
回复 1# abbr
  1. grep -Po '(?<=关爱是)[^,]+(?=,给学生)' a.txt
  2. 一个眼神
  3. 一缕青风
  4. 一场春雨
  5. 一句问侯
复制代码
这样?

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
3 [报告]
发表于 2015-05-02 01:19 |只看该作者
回复 1# abbr
  1. sed -nr 's#^\w{3}([^,]+),.*$#\1#p' a.txt
  2. awk --re-interval '{print gensub(/\w{3}([^,]+),.*$/,"\\1","g")}' a.txt
复制代码
两个表达式是一样的。。。。。

论坛徽章:
0
4 [报告]
发表于 2015-05-02 12:25 |只看该作者
谢谢楼上的兄弟,能解释一下二楼的符号吗?
这个只是一个简化的,真正文本中没有这么有规律,还是希望能通过文本匹配出来,而不是W{3}这样匹配三个字符。因为在文本中可能前面还有其他文字。
比如
我们的关爱是一个眼神,给学生无声的祝福;但是他们的关爱是一缕青风,给学生身心的舒畅;亲戚的关爱是一场春雨,给学生心田的滋润;家人的关爱是一句问侯,给学生春天的温暖。

类似这样

论坛徽章:
20
卯兔
日期:2015-01-26 22:05:142015亚冠之萨济拖拉机
日期:2015-09-10 15:15:282015亚冠之阿尔希拉尔
日期:2015-09-25 17:37:53程序设计版块每日发帖之星
日期:2015-10-03 06:20:00程序设计版块每日发帖之星
日期:2015-12-09 06:20:00CU十四周年纪念徽章
日期:2015-12-17 09:07:15程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:34程序设计版块每日发帖之星
日期:2015-12-25 06:20:342015亚冠之广州富力
日期:2015-08-27 19:29:56每日论坛发贴之星
日期:2015-08-26 06:20:002015亚冠之阿尔希拉尔
日期:2015-05-18 17:26:27
5 [报告]
发表于 2015-05-02 12:59 |只看该作者
回复 4# dpblue
'(?<=...)(?=...)这种写法叫零宽断言(或环视正则表达式),仅仅是匹配位置,不匹配任何字符

关爱是一个眼神,给学生无声的祝福;
'(?<=关爱是)[^,]+(?=,给学生)'
匹配位置   匹配内容  匹配位置

论坛徽章:
0
6 [报告]
发表于 2015-05-02 16:48 |只看该作者
谢谢楼上的兄弟,应该搞定了!
不过跟你这个有些不一样,我是这么写的:
(?<=关爱是).*?(?=,给学生)
用你那个表达式:
(?<=关爱是)[^,]+(?=,给)
中间[^,]的意思是不匹配逗号吧?很奇怪用这个表达式前面两行需要匹配的内容选不出来,后两个可以

论坛徽章:
28
2015年迎新春徽章
日期:2015-03-04 10:16:53午马
日期:2015-03-20 17:11:07亥猪
日期:2015-03-20 17:11:23戌狗
日期:2015-03-20 17:11:33酉鸡
日期:2015-03-20 17:11:47申猴
日期:2015-03-20 17:11:58未羊
日期:2015-03-20 17:12:10子鼠
日期:2015-03-20 17:12:23丑牛
日期:2015-03-20 17:12:40卯兔
日期:2015-03-20 17:12:51辰龙
日期:2015-03-20 17:13:00巳蛇
日期:2015-03-20 17:13:12
7 [报告]
发表于 2015-05-03 14:43 |只看该作者
  1. sed -r 's/关爱是(.+),.+/\1/' inputfile
  2. awk -F'关爱是|,' '$0=$2' inputfile
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP