代码之家  ›  专栏  ›  技术社区  ›  shinjuo

用perl拆分变化的字符串

  •  0
  • shinjuo  · 技术社区  · 16 年前

    10 NE HARRISBURG
    4 E HASWELL
    2 SE OAKLEY
    6 SE REDBIRD
    PROVO
    6 W EADS
    21 N HARRISON
    

    我需要做的是删除城市名称前的数字和字母。我遇到的问题是,城市之间的差别很大。数据几乎从不一样。是否可以删除此数据并将其保存在单独的字符串中?

    5 回复  |  直到 16 年前
        1
  •  2
  •   Toto    16 年前
    my @l = (
    '10 NE HARRISBURG',
    '4 E HASWELL',
    '2 SE OAKLEY',
    '6 SE REDBIRD',
    'PROVO',
    '6 W EADS',
    '21 N HARRISON',
    );
    
    foreach(@l) {
    

    根据hoobs的说法,我改了regex

        my($beg, $rest) = ($_ =~ /^(\d*\s(?:[NS]|[NS]?[EW])*)?(.*)$/);
        print "beg=$beg \trest=$rest\n";    
    }
    

    beg=10 NE   rest=HARRISBURG
    beg=4 E     rest=HASWELL
    beg=2 SE    rest=OAKLEY
    beg=6 SE    rest=REDBIRD
    beg=    rest=PROVO
    beg=6 W     rest=EADS
    beg=21 N    rest=HARRISON
    

    对于shinjuo,如果只想运行一个字符串,可以执行以下操作:

      my($beg, $rest) = ($l[3] =~ /^(\d*\s(?:[NS]|[NS]?[EW])*)?(.*)$/);
      print "beg=$beg \trest=$rest\n";
    

    为避免未初始化值出现警告,必须测试是否定义了$beg:

    print defined$beg?"beg=$beg\t":"", "rest=$rest\n";
    
        2
  •  3
  •   Eugene Yarmash    16 年前

    for my $s (@strings) {
        my @fields = split /\s+/, $s, 3;
        my $city = $fields[-1];
    }
    

    可以测试数组大小以确定字段数:

    my $n = @fields;
    
        3
  •  1
  •   user3458 user3458    16 年前

    看起来您总是想要split()结果中的最后一个元素。或者您可以使用m/(\S+)$/。

        4
  •  1
  •   Philippe A.    16 年前

    难道我们不能假设总是有一个城市的名字,它出现在最后一行吗?如果是这样的话,把线分开,保留最后一部分。下面是一个单行命令行解决方案:

    perl -lne 'split ; print $_[-1]' input.txt
    

    输出:

    HARRISBURG
    HASWELL
    OAKLEY
    REDBIRD
    PROVO
    EADS
    HARRISON
    

    更新1

    如果你有像旧金山这样的城市名称,这个解决方案就行不通了(下面的评论中提到了这个例子)。

    你的输入数据来自哪里?如果您自己生成了它,那么应该添加分隔符。如果有人为您生成了它,请他们使用分隔符重新生成它。解析它将成为儿戏。

    # replace ";" for your delimiter
    perl -lne 'split ";" ; print $_[-1]' input.txt
    
        5
  •  1
  •   Community Mohan Dere    6 年前

    正则表达式解决方案



    #!/usr/bin/perl -w    
    
    use strict; 
    use Data::Dumper;   
    
       sub main{    
          my @strings = (    
                          '10 NE HARRISBURG'    
                        , '4 E HASWELL'    
                        , '2 SE OAKLEY'    
                        , '6 SE REDBIRD'    
                        , 'PROVO'    
                        , '6 W EADS'    
                        , '21 N HARRISON'    
                        , '32 SAN FRANCISCO' 
                        , ''   
                        , '15 NEW YORK'    
                        , '15 NNW NEW YORK'    
                        , '15 NW NEW YORK'     
                        , 'NW NEW YORK'    
                        );       
    
          my %hash;
          my $count=0;
          for (@strings){    
             if (/\d*\s*[NS]{0,2}[EW]{0,1}\s+/){
                # if there was a speed / direction
                $hash{$count}{wind} = $&;
                $hash{$count}{city} = $';
             } else {
                # if there was only a city
                $hash{$count}{city} = $_;
             }
             $count++;
          }    
          
          print Dumper(\%hash);  
       }    
           
       main();  
    

    解决方案二:去掉你不需要的东西


    #!/usr/bin/perl -w    
    
    use strict;    
    
       sub main{    
          my @strings = (    
                          '10 NE HARRISBURG'    
                        , '4 E HASWELL'    
                        , '2 SE OAKLEY'    
                        , '6 SE REDBIRD'    
                        , 'PROVO'    
                        , '6 W EADS'    
                        , '21 N HARRISON'    
                        , '32 SAN FRANCISCO'    
                        , '15 NEW YORK'    
                        , '15 NNW NEW YORK'    
                        , '15 NW NEW YORK'     
                        , 'NW NEW YORK'     
                        );    
    
          for my $elem (@strings){    
             $elem =~ s/\d*\s*[NS]{0,2}[EW]{0,1}\s+(\w*)/$1/;    
          }    
    
          $"="\n";    
          print "@strings\n";        
       }    
           
       main();    
    

    更新:

    进行更改 vol7ron