免费注册 查看新帖 |

Chinaunix

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

[文本处理] 文本截取~~(各位大神支招,不限语言) [复制链接]

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-26 11:50 |只看该作者 |倒序浏览
题目是:
假设有"123<em>abc</em>456<em>def</em>789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。

要求:
1 <em>和</em>标记不得计算在长度之内。
2 截取后的字符串,要保留原有<em>标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。

示例:
题中的字符串,要截取长度5,则返回的字符串应该为:123ab,要截取长度8,应返回123<em>abc</em>45。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2014-09-26 13:01 |只看该作者
本帖最后由 ly5066113 于 2014-09-26 13:34 编辑

回复 1# reb00t


try:
  1. awk -v l=8 -v RS='<[^>]*>' '{if(!(NR%2==0&&l<length))printf r;printf substr($0,1,l);if((l-=length)<0)exit;r=RT}'
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-09-26 13:01 |只看该作者
写个伪py
  1. >>> s = '123<em>abc</em>456<em>def</em>789'
  2. >>>
  3. >>> import re
  4. >>> s = '123<em>abc</em>456<em>def</em>789'
  5. >>> index = 5
  6. >>> re.sub(r'(.{3})(.{3})',r'\1<em>\2</em>',re.sub(r'</?em>','',s)[:index])
  7. '123ab'
  8. >>> index = 8
  9. >>> re.sub(r'(.{3})(.{3})',r'\1<em>\2</em>',re.sub(r'</?em>','',s)[:index])
  10. '123<em>abc</em>45'
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
4 [报告]
发表于 2014-09-26 13:07 |只看该作者
回复 1# reb00t

$ echo "123<em>abc</em>456<em>def</em>789" | awk -vx=5 'BEGIN{FS="";w=1}{for(n=1;n<=NF;n++){if($n=="<")w=0;c+=w;a[c]=n;if($n==">"){w=1;a[c]=n}};d=substr($0,1,a[x]);d=gensub(/<em>([^<]+)$/,"\\1","",d);print d}'
123ab

$ echo "123<em>abc</em>456<em>def</em>789" | awk -vx=8 'BEGIN{FS="";w=1}{for(n=1;n<=NF;n++){if($n=="<")w=0;c+=w;a[c]=n;if($n==">"){w=1;a[c]=n}};d=substr($0,1,a[x]);d=gensub(/<em>([^<]+)$/,"\\1","",d);print d}'
123<em>abc</em>45

$ echo "123<em>abc</em>456<em>def</em>789" | awk -vx=13 'BEGIN{FS="";w=1}{for(n=1;n<=NF;n++){if($n=="<")w=0;c+=w;a[c]=n;if($n==">"){w=1;a[c]=n}};d=substr($0,1,a[x]);d=gensub(/<em>([^<]+)$/,"\\1","",d);print d}'
123<em>abc</em>456<em>def</em>7

论坛徽章:
0
5 [报告]
发表于 2014-09-26 13:21 |只看该作者
本帖最后由 love_shift 于 2014-09-26 13:24 编辑
  1. [root@localhost home]# echo '123<em>abc</em>456<em>def</em>789' | sed -r 's#</?em>##g;s/(^.{5}).*/\1/;s#(.{3})(.{3})#\1<em>\2</em>#g'
  2. 123ab
  3. [root@localhost home]# echo '123<em>abc</em>456<em>def</em>789' | sed -r 's#</?em>##g;s/(^.{8}).*/\1/;s#(.{3})(.{3})#\1<em>\2</em>#g'
  4. 123<em>abc</em>45
复制代码
思路一样,copy下

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
6 [报告]
发表于 2014-09-26 13:35 |只看该作者
本帖最后由 reb00t 于 2014-09-26 13:36 编辑
  1. <?php

  2. //$str = "123<em>abc</em>456<em>def</em>789";
  3. $str = "1<em>abc</em>d<em>f</em>789";
  4. $length = 7;
  5. function strfind($str,$length){
  6.    $pa = '/<[^>]+>/';
  7.    $arr = preg_split($pa, trim($str));
  8.    foreach ($arr as $k => $v) {
  9.         if(strlen(trim($v))< $length){
  10.             $newarr[]=$v;
  11.             $t++;
  12.             $length = $length-strlen(trim($v));
  13.          }else{
  14.             $newarr[]=substr($v, 0, $length);
  15.             break;
  16.          }
  17.       
  18.    }
  19.    $e =count($newarr)-1;
  20.    foreach ($newarr as $kk => $vv) {
  21.        if($t>=2 && $kk!=$e){
  22.         $OFS=($kk%2==0)?"<em>":"</em>";
  23.         $newstr.=$vv.$OFS;
  24.        }else{
  25.          $OFS="";
  26.          $newstr.=$vv.$OFS;
  27.        }           
  28.     }
  29.       echo $newstr;
  30.    
  31. }
  32. strfind($str,$length);
  33. ?>
复制代码
脚本支持字符串任意变化,长度任意。

结果:
1<em>abc</em>d<em>f</em>7[Finished in 0.3s]

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
7 [报告]
发表于 2014-09-26 13:38 |只看该作者
回复 4# jason680


x=3 的时候有问题

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
8 [报告]
发表于 2014-09-26 13:51 |只看该作者
回复 7# ly5066113
  1. 123<em>
复制代码

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
9 [报告]
发表于 2014-09-26 14:09 |只看该作者
回复 2# ly5066113


    原来还有RT这种变量啊,学到了。。。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2014-09-26 14:22 |只看该作者
回复 7# ly5066113

Thank you for your notice.

$ echo "123<em>abc</em>456<em>def</em>789" | awk -vx=3 'BEGIN{FS="";w=1}{for(n=1;n<=NF;n++){if($n=="<")w=0;c+=w;a[c]=n;if($n==">"){w=1;a[c]=n}};d=substr($0,1,a[x]);d=gensub(/<em>([^<]+)$/,"\\1","",d);print d}'
123<em>

$ echo "123<em>abc</em>456<em>def</em>789" | awk -vx=3 'BEGIN{FS="";w=1}{for(n=1;n<=NF;n++){if($n=="<")w=0;c+=w;a[c]=n;if($n==">"){w=1;a[c]=n}};d=substr($0,1,a[x]);d=gensub(/<em>([^<]*)$/,"\\1","",d);print d}'
123


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP