2010-11-29 33 views
0

私は切り取ってジョージマイケルのDVDトラックリストをAmazonから$strで、その後のコードを最初の2桁とそれ以外で分割して処理します:1つの線を2つの部分に分割する

$str = "20 Fastlove 21 Jesus To A Child 22 Spinning the Wheel 23 Older 24 Outside 25 As (with Mary J. Blige) 26 Freeek! 27 Amazing 28 John and Elvis are Dead 29 Flawless (Go To The City) 30 Shoot The Dog 31 Roxanne 32 An Easier Affair 33 If I Told You That (with Whitney Houston) 34 Waltz Away Dreaming 35 Somebody To Love 36 I Can’t Make You Love Me 37 Star People '97 38 You Have Been Loved 39 Killer/ Papa Was A RollIn Stone 40 Round Here"; 

while ($str =~ /(\d{2}) (\S+)/g) { 
     print "$1 $2\n"; 
} 

結果:

20 Fastlove 
21 Jesus 
22 Spinning 
23 Older 
24 Outside 
25 As 
26 Freeek! 
27 Amazing 
28 John 
29 Flawless 
30 Shoot 
31 Roxanne 
32 An 
33 If 
34 Waltz 
35 Somebody 
36 I 
37 Star 
97 38 
39 Killer/ 
40 Round 

上記の種類の作品は、フルトラック名は含まれていません。私が望む結果を得る方法についてのアドバイスはありますか?私が期待している、または望む結果は次のとおりです。

20 Fastlove 
21 Jesus To A Child 
22 Spinning the Wheel 
[etc.] 
+2

質問を理解できません。 – tchrist

+4

曲名に数字が表示されないようにすることはできません。 –

+0

情報のためにAmazonを盗むのではなく、CDDBのようなトラック情報のデータベースを使用してみませんか? – Ether

答えて

1

あなたはとてもとても近いです:

$str = "20 Fastlove 21 Jesus To A Child 22 Spinning the Wheel 23 Older 24 Outside 25 As (with Mary J. Blige) 26 Freeek! 27 Amazing 28 John and Elvis are Dead 29 Flawless (Go To The City) 30 Shoot The Dog 31 Roxanne 32 An Easier Affair 33 If I Told You That (with Whitney Houston) 34 Waltz Away Dreaming 35 Somebody To Love 36 I Can’t Make You Love Me 37 Star People '97 38 You Have Been Loved 39 Killer/ Papa Was A RollIn Stone 40 Round Here"; 

while ($str =~ /(\d{2}[^\d]*)/g) { 
    print "$1\n"; 
} 

注意正規表現、私はない、その文字を意味する[^ ]構文を使用しています。 [^ \ d]は数字ではなく、最後のアスタリスクはゼロ以上を意味します。

数字を見つけるまで残りの文字列を続けるように指定することで、残りの名前を選択できます(つまり、Star People '97まで)。

2つの別々の変数に番号とタイトルが必要な場合は、かっこを使用できます。

$str = "20 Fastlove 21 Jesus To A Child 22 Spinning the Wheel 23 Older 24 Outside 25 As (with Mary J. Blige) 26 Freeek! 27 Amazing 28 John and Elvis are Dead 29 Flawless (Go To The City) 30 Shoot The Dog 31 Roxanne 32 An Easier Affair 33 If I Told You That (with Whitney Houston) 34 Waltz Away Dreaming 35 Somebody To Love 36 I Can’t Make You Love Me 37 Star People '97 38 You Have Been Loved 39 Killer/ Papa Was A RollIn Stone 40 Round Here"; 

while ($str =~ /(\d{2})([^\d]*)/g) { 
    my $number = $1; 
    my $title = $2; 

    print "$number: $title\n"; 
} 

はまだ仕事にスターピープル'97を取得する方法を把握しよう。私はそれが最初の一重引用符と関係があると信じています。すべての数字の前にスペースがあるか、または行の先頭にあります。それが使えるのだろうか?

+1

はい、使用できます。実際、それはまさに私が私の答えでしたことです。 –

1

イグナシオバスケス - エイブラムスが言ったように、数字と歌の名前が問題になりますが、これは「スターピープル'97」

/(\d{2}) (\D+)/g 
以外のすべてのために働く必要があります

注:(。述べた「'97」の場合を除いて)私はPerlのコーダないんだけど、正規表現はrubular.comで正しく動作

6

イグナシオが言ったように、これは本当にで行うことができませんトラック名に数字を含めることができるため、100%の精度が得られます。しかし、あなたはおそらく、あなたが100%にかなり近い来ることができる、トラック番号が連続になると仮定することができますので、:

my $str = "20 Fastlove 21 Jesus To A Child 22 Spinning the Wheel 23 Older 24 Outside 25 As (with Mary J. Blige) 26 Freeek! 27 Amazing 28 John and Elvis are Dead 29 Flawless (Go To The City) 30 Shoot The Dog 31 Roxanne 32 An Easier Affair 33 If I Told You That (with Whitney Houston) 34 Waltz Away Dreaming 35 Somebody To Love 36 I Cant Make You Love Me 37 Star People '97 38 You Have Been Loved 39 Killer/ Papa Was A RollIn Stone 40 Round Here"; 

my ($track) = ($str =~ /^(\d+)/) or die "No initial track number"; 

my $next; 
while ($next = $track + 1 and 
     $str =~ s/^\s*    # optional initial whitespace 
       $track \s+  # track number followed by whitespace 
       (\S.*?)   # title begins with non-whitespace 
       (?= \s+ $next \s # title stops at next track # 
        | $)  # or end-of-string 
       //x) { 
    print "$track $1\n"; 
    $track = $next; 
} 

die "$str left over" if $str =~ /\S/; # sanity check 

これは$strを変更し、その必要に応じてコピーを作成します。

トラックのタイトルに次のトラック番号が含まれていても、これはまれです。行方不明のトラックが存在する場合、またはトラック番号が非連続である場合も失敗します。

2

非破壊入力文字列をスキャンしCJMの答えのバリアント:

if ($str =~ /^(\d+)/) { 
    my ($current, $next) = ($1, $1 + 1); 
    while ($str =~ /\G *$current ((?:(?! *$next).)+)/g) { 
     print "$current $1\n"; 
     ($current, $next) = ($next, $next + 1); 
    } 
} 
1

あなたの最善の策は、次のようなものです。しかし、トラックの1つに次のトラックの番号が含まれていても問題あります。これは、空白が続くと非空白が先行していない1桁以上の任意のシーケンスがトラック番号であると仮定し

while ($str =~ /(?<!\S)(\d+)\s+((?!\d+\s)\S+(?:\s+(?!\d+\s)\S+)*)/g) { 
    print "$1 $2\n"; 
} 

'97内をなくしこと:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $str = "20 Fastlove 21 Jesus To A Child 22 Spinning the Wheel 23 Older 24 Outside 25 As (with Mary J. Blige) 26 Freeek! 27 Amazing 28 John and Elvis are Dead 29 Flawless (Go To The City) 30 Shoot The Dog 31 Roxanne 32 An Easier Affair 33 If I Told You That (with Whitney Houston) 34 Waltz Away Dreaming 35 Somebody To Love 36 I Can’t Make You Love Me 37 Star People '97 38 You Have Been Loved 39 Killer/ Papa Was A RollIn Stone 40 Round Here"; 

my @parts = split " ", $str; 

my %songs; 
my $track  = shift @parts; 
my $new_track = $track + 1; 
my $song  = ""; 
while (@parts) { 
    my $part = shift @parts; 
    unless ($part eq $new_track) { 
     $song .= " $part"; 
     next; 
    } 
    $songs{$track} = $song; 
    $song   = ""; 
    $track   = $new_track; 
    $new_track  = $track + 1; 
} 

for my $track (sort { $a <=> $b } keys %songs) { 
    print "$track\t$songs{$track}\n"; 
} 
2

ここでは別のアプローチ(also on ideone.com)です。トラック番号37のタイトルですが、曲名に裸の番号がついているのを止めるものは何もありません

一般的に、@ cjmの連続番号のアイデアはおそらくあなたの最善の策だと思います。

+0

私は、Perl以外のコーダーとして読めるものがほしいと思っていました。これは仕事をうまく行い、私はそれが好きです。 – farhany

2

「このトラック名には次のトラックのトラック番号が含まれています」という問題以外は、あなたの特定の質問に非常によく似ていると思いますので、ここで答えをアップアップしました。このプロパティを持つアルバムは、ほんの僅かになります。

しかし、私はそれを言う必要があります、あなたの問題は、最初にその形式で$strを持つことに起因しています。たとえば、this pageのソースを見ると、トラックの名前に関係なくHTML自体からトラック名を簡単に抽出できます。

これは、HTMLがトラックを明確に示すためです。今は、その情報が利用可能かどうかはわかりませんが、最初にそのデータをどのように取得しているのか考え直すことが必要な場合があります。あなたの人生をもっと楽にするかもしれません。または、より簡単ではない場合、少なくともより正確なもの:-)

+0

これはCDです。 AmazonのDVD曲目リストはそれほど整理されていない。私はOPのDVDを見つけることができませんでしたが、[こちらも同様です](http://www.amazon.com/George-Michael-Live-London/dp/B002TO1Z8Q/)。 – cjm

+1

次に、http://en.wikipedia.org/wiki/George_Michael_Live_in_LondonやCDDB(http://en.wikipedia.org/wiki/CDDB)やその他の情報提供者など、他の場所の情報を見つけることができますあなたのより良いフォーマットを得るために。答えは実際にはあなたが平文で「正規表現の体操」をする必要がないという意味のデータのためのより良い情報源を見つけることでした:-) – paxdiablo

+0

私はあなたの用語「正規表現の体操」を好きです。私は他の場所でより良い情報源を探します。 DVDDBやBRDBがないのは残念です。 :) – farhany

関連する問題