- 締切済み
Ruby 正規表現による文章取得
こんばんは。 最近正規表現を用いたスクローリングを行っているのですが、 その中でうまく動かない部分があったため質問させていただきました。 プログラムは以下の通りです。 text = "" data = Dir.glob("/home/edinet/**/*.html") data.each do |find| flag = nil IO.foreach(find) do |line2| case line2 when /保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目/ flag = true when /保有目的が純投資目的である投資株式の前事業年度|保有目的が純投資目的|普通株式/ flag = false end text << line2.chomp if flag == true end print text end >保有目的が純投資目的である投資株式の前事業年度|保有目的が純投資目的|普通株式 この3つのどれかが含まれている場合にfalseを返し、文字列の取得が終了するはずなのですが、「普通株式」が含まれている行以降も文字列を取得し続けてしまいます。 正規表現が間違っているためなのでしょうか? ご回答の程どうかよろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tatsu99
- ベストアンサー率52% (391/751)
あなたがなさりたいことが良く判らないのですが、 こういうことですか? 1.「保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目」 の文字列があれば、それを取得する。 2.但し、「保有目的が純投資目的である投資株式の前事業年度」「保有目的が純投資目的」「普通株式」 の何れかの文字があれば、取得を打ち切る。 3.上記1,2の処理を取得した(html)ファイルの全てについて行う。 もし、そうであれば、以下のようにしてください。 ---------------------------------------------- data = Dir.glob("/home/edinet/**/*.html") data.each do |find| text = "" IO.foreach(find) do |line2| flag = nil case line2 when /保有目的が純投資目的以外の目的である投資株式の保有区分、銘柄、株式数、貸借対照表計上額及び保有目/ flag = true when /保有目的が純投資目的である投資株式の前事業年度|保有目的が純投資目的|普通株式/ flag = false end text << line2.chomp if flag == true break if flag == false end print text end ----------------------------------------------
- noranuko
- ベストアンサー率46% (620/1332)
"flagがfalseになったらforeachループを抜ける" とか、 "flagが1度falseになったら二度とtrueにしない" などの処理が含まれてないので、 1.1行取得 2.flagがfalseになったらtextに追加しない、trueだったらtextに追加 3.次の行取得 ->1~3ループし、全ての行を処理したら終了する という処理になってます。
お礼
丁寧なご回答ありがとうございました。
お礼
tatsu99様 質問の意図が分かりづらくて申し訳ありません。 大変分かり易いご回答ありがとうございます。