免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: 104359176
打印 上一主题 下一主题

[算法] 给 print 加括号 [复制链接]

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
21 [报告]
发表于 2013-11-07 12:20 |只看该作者
本帖最后由 yinyuemi 于 2013-11-07 12:21 编辑

回复 11# 104359176
  1. #!/usr/bin/env perl

  2. use strict;

  3. while(<DATA>){ print "raw:\t".$_;
  4.     while(s/(?:(^|\(|\s))'\(?(((?<=\()[^)]+\))|(\S*?'\S*?\([^)]+\))|\S+)((?<!\))\))?/$1quote ($2)/g){#print $_;
  5.     }
  6.     print "rep:\t".$_;
  7. }

  8. __DATA__
  9. abc
  10. abc 'abc
  11. abc '''abc
  12. abc 'abc abc
  13. abc (a b c) abc
  14. abc '(a b c) abc
  15. abc ''(a b c) abc
  16. abc ''''(a b c) abc
  17. abc 'abc (a b c) '(a b c) ''(a b c) abc
复制代码
  1. raw:        abc
  2. rep:        abc
  3. raw:        abc 'abc
  4. rep:        abc quote (abc)
  5. raw:        abc '''abc
  6. rep:        abc quote (quote (quote (abc)))
  7. raw:        abc 'abc abc
  8. rep:        abc quote (abc) abc
  9. raw:        abc (a b c) abc
  10. rep:        abc (a b c) abc
  11. raw:        abc '(a b c) abc
  12. rep:        abc quote (a b c)) abc
  13. raw:        abc ''(a b c) abc
  14. rep:        abc quote (quote (a b c))) abc
  15. raw:        abc ''''(a b c) abc
  16. rep:        abc quote (quote (quote (quote (a b c))))) abc
  17. raw:        abc 'abc (a b c) '(a b c) ''(a b c) abc
  18. rep:        abc quote (abc) (a b c) quote (a b c)) quote (quote (a b c))) abc
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
22 [报告]
发表于 2013-11-07 12:37 |只看该作者
回复 21# yinyuemi


    理论上看样能用一个正则表达式解决,但这个方案不能扩展,也不能抽象。因为 --- 太难了。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
23 [报告]
发表于 2013-11-07 16:24 |只看该作者
回复 22# 104359176


     其实实际文本处理中,我很少敢用太复杂的正则,因为时间长了再看的时候,会有“失忆”的感觉

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
24 [报告]
发表于 2013-11-07 19:37 |只看该作者
太难了。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
25 [报告]
发表于 2013-11-09 00:21 |只看该作者
本帖最后由 rubyish 于 2013-11-08 20:24 编辑

凑合:
  1. #!/usr/bin/perl

  2. sub new { "( quote @_ )" }
  3. while (<DATA>) {
  4.     chomp;
  5.     my @line = grep $_, split /\s*([(')])\s*/;
  6.     my @Qindex = grep $line[$_] eq "'", 0 .. $#line;
  7.     for my $q ( reverse @Qindex ) {
  8.         $line[ $q + 1 ] ne '('
  9.           and splice @line, $q, 2, new $line[ $q + 1 ]
  10.           and next;
  11.         my $open = 1;
  12.         for my $i ( $q + 2 .. $#line ) {
  13.             $open-- if $line[$i] eq ')';
  14.             $open++ if $line[$i] eq '(';
  15.             !$open
  16.               and splice @line, $q, $i - $q + 1, new @line[ $q + 1 .. $i ]
  17.               and last;
  18.         }
  19.     }
  20.     print "OLD\t$_\n";
  21.     print "NEW\t", join( ' ', @line ), $/;
  22.     print '-' x 90, $/;
  23. }

  24. __DATA__
  25. a
  26. 'a
  27. ''a
  28. (a b)
  29. '(a b)
  30. ''(a b)
  31. abc 'abc (a b c) '(a b c) ''(a b c) abc
  32. (if (> 1 2) (print '(list ''(a b))))
复制代码
  1. OLD     a
  2. NEW     a
  3. ------------------------------------------------------------------------------------------
  4. OLD     'a
  5. NEW     ( quote a )
  6. ------------------------------------------------------------------------------------------
  7. OLD     ''a
  8. NEW     ( quote ( quote a ) )
  9. ------------------------------------------------------------------------------------------
  10. OLD     (a b)
  11. NEW     ( a b )
  12. ------------------------------------------------------------------------------------------
  13. OLD     '(a b)
  14. NEW     ( quote ( a b ) )
  15. ------------------------------------------------------------------------------------------
  16. OLD     ''(a b)
  17. NEW     ( quote ( quote ( a b ) ) )
  18. ------------------------------------------------------------------------------------------
  19. OLD     abc 'abc (a b c) '(a b c) ''(a b c) abc
  20. NEW     abc ( quote abc ) ( a b c ) ( quote ( a b c ) ) ( quote ( quote ( a b c ) ) ) abc
  21. ------------------------------------------------------------------------------------------
  22. OLD     (if (> 1 2) (print '(list ''(a b))))
  23. NEW     ( if ( > 1 2 ) ( print ( quote ( list ( quote ( quote ( a b ) ) ) ) ) ) )
  24. ------------------------------------------------------------------------------------------
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP