免费注册 查看新帖 |

Chinaunix

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

[文本处理] 各位大大能不能给我这个标示的脚本? [复制链接]

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
11 [报告]
发表于 2013-10-28 16:00 |只看该作者
本帖最后由 104359176 于 2013-10-31 19:41 编辑
  1. #!perl

  2. use 5.016;
  3. use YAML qw(Dump);

  4. my @array = <DATA>;
  5. chomp @array;

  6. my @pattern_list = qw(
  7. X+$
  8. X+A
  9. X+B[^X]
  10. X+B$
  11. X+B(?<=X)
  12. X+C$
  13. X+C(?<=X)
  14. X+C[^X]$
  15. X+C[^X](?<=X)
  16. X+C[^X][^X]
  17. X+D$
  18. X+D[^X]$
  19. X+D[^X][^X]$
  20. X+D[^X](?<=X)
  21. X+D[^X][^X](?<=X)
  22. X+D[^X][^X][^X]
  23. );

  24. say Dump(zhuan_zhi(change_array(zhuan_zhi(change_array([@array])))));

  25. sub wu_ran {
  26.     my $char_list = shift;
  27.     foreach my $pat (@pattern_list) {
  28.         # x equal X
  29.         $char_list =~ s/($pat)/lc($1)/gei;
  30.     }
  31.     return $char_list;
  32. }

  33. sub change_wu_ran {
  34.     my $char_list = shift;
  35.     $char_list = wu_ran($char_list);
  36.     $char_list = scalar reverse(wu_ran(scalar reverse($char_list)));
  37.     return $char_list;
  38. }

  39. sub change_array {
  40.     my $ref_array = shift;
  41.     my @change_array = ();
  42.     foreach my $char_list (@{$ref_array}) {
  43.         my $change_char_list = change_wu_ran($char_list);
  44.         push @change_array, $change_char_list;
  45.     }
  46.     return [ @change_array ];
  47. }

  48. sub zhuan_zhi {
  49.     my $array = shift;
  50.     my $zhuan_zhi = [];
  51.     foreach my $char_list (values $array) {
  52.         my $array_count = 0;
  53.         foreach my $char (split //, $char_list) {
  54.             $zhuan_zhi->[$array_count] .= $char;
  55.             $array_count++;
  56.         }
  57.     }
  58.     return $zhuan_zhi;
  59. }

  60. __DATA__
  61. ABDCDCDCAAXCXCDCCABABDCDCDCAABXBABDCDCDCAABBCDCCAXDBBXABDCDCDCAABBCDXCCA
  62. BBCDCCABBBABXCDCDCAABBCDXCCABBBBBABDCDCDCAABBCDCCAXBBBABCDAAAXBCDADCAXXX
  63. XABCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA
  64. AACDCCAADCABDCDCDCAABXCDXCXABCDDBABDCDCDCAABBXBXCAABBBABCDAAAXBCDADCABBB
  65. ADCAAAAAXABCDCCCCCDCABXBBCCDCCABABDCDCDCAABXBABDABDCCCAXCDCDCAAAAABBCDCC
  66. XCCCAABDCAAXXAADCCCCCCAACCAAAAAAAAAXBBDCCXACDACDAAXCBBBBBBBAAABCADDCAAXC
  67. XABCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA
复制代码
output:
  1. ---
  2. - aBDCDCDCaaxCxcdcCABABDCDcDcAabxbaBDCDCDCAABbCdCcaxdbbxaBDCDCDcAAbbcdxcca
  3. - bBCDCCABbBabxcdcDCAAbbcdxccaBBbbBABDCDCDCAAbBcDcCaxbbbABCDAAaxbcDADCaxxx
  4. - xaBCDCDCaaxbbCCDCCABAbdCDCdCAabxbaBdABACCCaxcdcdCAaBBcDcCABbbxaBDCDCDcaa
  5. - aACDCCAAdCabdCDCDCAabxcDxCxaBCDDBABdCDCDCAAbbxBxcaaBBBAbCDAAaxbcDADCAbbB
  6. - aDCAAAAaxaBcDCCCCCDCabxbbCcDCCABABDcDCDCAabxbaBdABDCCCaxcdcDCaAAAABBCdcC
  7. - xcccAABDcAaxxaADCCCCCcaAcCaAAAAaAAaxbbdccxaCDACdAaxcbbBbBBBAAaBCADDCAaxc
  8. - xaBCDCDCaaxbbCCDCCABABDCDCdCAabxbaBdABACCcaxcdcdCAaBBCDcCABbbxaBDCDCDCaA
复制代码

论坛徽章:
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
12 [报告]
发表于 2013-10-29 03:29 |只看该作者
本帖最后由 rubyish 于 2013-10-28 23:46 编辑

成功~
  1. #!/usr/bin/perl

  2. my %V = qw/x 0 a 1 b 2 c 3 d 4 X 0 A 1 B 2 C 3 D 4/;
  3. my %uc = qw/A 1 B 1 C 1 D 1/;
  4. my ( @data, %X );
  5. sub MIN { @_[ $_[0] > $_[1] ] }

  6. while (<DATA>) {
  7.     chomp;
  8.     my @line = split //;
  9.     my @X =
  10.       grep { $line[$_] eq 'X' and push @{ $X{$_} }, $. - 1 } 0 .. $#line;
  11.     for my $i ( 0 .. $#X ) {
  12.         my $L = $i > 0
  13.           ? MIN( $X[$i] - $X[ $i - 1 ], $V{ $line[ $X[$i] - 1 ] } )
  14.           : $X[$i] ? MIN( $X[$i], $V{ $line[ $X[$i] - 1 ] } ) : 0;
  15.         my $R = $i < $#X
  16.           ? MIN( $X[ $i + 1 ] - $X[$i], $V{ $line[ $X[$i] + 1 ] } )
  17.           : $#line != $X[$i]
  18.             ? MIN( $V{ $line[ $X[$i] + 1 ] }, $#line - $X[$i] ) : 0;
  19.         $line[$_] = lc $line[$_] for $X[$i] - $L .. $X[$i] + $R;
  20.     }
  21.     push @data, \@line;
  22. }

  23. for my $x ( sort { $a <=> $b } keys %X ) {
  24.     my @Y = @{ $X{$x} };
  25.     for my $j ( 0 .. $#Y ) {
  26.         my $T = $j > 0
  27.           ? MIN( $Y[$j] - $Y[ $j - 1 ], $V{ $data[ $Y[$j] - 1 ][$x] } )
  28.           : $Y[$j] ? MIN( $Y[$j], $V{ $data[ $Y[$j] - 1 ][$x] } ) : 0;
  29.         my $B = $j < $#Y
  30.           ? MIN( $Y[ $j + 1 ] - $Y[$j], $V{ $data[ $Y[$j] + 1 ][$x] } )
  31.           : $#data != $Y[$j]
  32.             ? MIN( $V{ $data[ $Y[$j] + 1 ][$x] }, $#data - $Y[$j] ) : 0;
  33.         $uc{ $data[$_][$x] } and $data[$_][$x] = lc $data[$_][$x]
  34.           for $Y[$j] - $T .. $Y[$j] + $B;
  35.     }
  36. }

  37. print @$_, $/ for @data;

  38. __DATA__
  39. ABDCDCDCAAXCXCDCCABABDCDCDCAABXBABDCDCDCAABBCDCCAXDBBXABDCDCDCAABBCDXCCA
  40. BBCDCCABBBABXCDCDCAABBCDXCCABBBBBABDCDCDCAABBCDCCAXBBBABCDAAAXBCDADCAXXX
  41. ABDXACDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXABDCDCDCAA
  42. AACDCCAADCABDCDCDCAABXCDXCXABCDDBABDCDCDCAABBXBXCAABBBABCDAAAXBCDADCABBB
  43. ADCAAAAAXABCDCCCCCDCABXBBCCDCCABABDCDCDCAABXBABDABDCCCAXCDCDCAAAAABBCDCC
  44. XCCCAABDCAAXXAADCCCCCCAACCAAAAAAAAAXBBDCCXACDACDAAXCBBBBBBBAAABCADDCAAXC
  45. AAAAXDXBCDCDCAAXBBCCDCCABABDCDCDCAABXBABDABACCCAXCDCDCAABBCDCCABBBXDXAAA
复制代码

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


    你的代码比问题还复杂,基本感觉是在看机器码。如果代码出问题了,估计又要纠结了。

论坛徽章:
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
14 [报告]
发表于 2013-10-30 13:56 |只看该作者
回复 11# 104359176


谢谢了,果然 lz的正则匹配功力已经到了遥不可及的地步了。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
15 [报告]
发表于 2013-10-30 16:09 |只看该作者
本帖最后由 104359176 于 2013-10-30 16:10 编辑

回复 14# pitonas


     如果代码让人感觉遥不可及,就危险了,也许我用了后顾的功能,这个确实很多人不知道。其实也可以不用。

    把  (?<=X) 直接替换成 X 也行。不过不知道污染过的数据,还能继续污染吗?

论坛徽章:
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
16 [报告]
发表于 2013-10-30 16:25 |只看该作者
回复 15# 104359176



感觉污染过的数据abcd不能继续污染

论坛徽章:
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
17 [报告]
发表于 2013-10-31 02:17 |只看该作者
回复 13# 104359176


    谢谢 lz 。简化SLOW版~
  1. #!/usr/bin/perl
  2. my %V = qw/x 0 a 1 b 2 c 3 d 4 X 0 A 1 B 2 C 3 D 4/;
  3. sub min  { @_[ $_[0] > $_[1] ] }
  4. sub mark {
  5.     for my $E (@_) {
  6.         my @X = grep $E->[$_] =~ /^[Xx]$/, 0 .. $#$E;
  7.         for my $i ( 0 .. $#X ) {
  8.             my $L = $i > 0
  9.               ? min( $X[$i] - $X[ $i - 1 ], $V{ $E->[ $X[$i] - 1 ] } )
  10.               : $X[$i] ? min( $X[$i], $V{ $E->[ $X[$i] - 1 ] } ) : 0;
  11.             my $R = $i < $#X
  12.               ? min( $X[ $i + 1 ] - $X[$i], $V{ $E->[ $X[$i] + 1 ] } )
  13.               : $#$E != $X[$i]
  14.                 ? min( $V{ $E->[ $X[$i] + 1 ] }, $#$E - $X[$i] ) : 0;
  15.             $_ = lc $_ for @{$E}[ $X[$i] - $L .. $X[$i] + $R ];
  16.     } } @_
  17. }
  18. sub rock   { map { $a = $_; [ map $_[$_][$a], 0 .. $#_ ] } 0 .. $#{ $_[0] } }
  19. sub marked { rock mark rock mark @_ }
  20. sub data   { map { chomp; [ split // ] } <DATA> }

  21. print @$_, $/ for marked data;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP