質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

715閲覧

文字列の中に含まれている同じ条件の文字列を複数抜き出したい

hiroshiga

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/26 14:55

現在tableという変数に入っているこのような文字列が入っています。(tableに囲まれている部分は10個ほどありすべてハッシュに変換したいのですが文量が多くなってしまうので省略させていただきました)

<table><tr><th>場所</th><td>家</td></tr><tr><th>ナンバー</th><td>〒000-0000</td></tr><tr><th>住所</th><td>東京都</td></tr><tr><th>最寄り駅</th><td>東海道線</td></tr></table><h3 class="heading">東北地方</h3><table><tr><th>場所</th><td>会社</td></tr><tr><th>ナンバー</th><td>〒111-1111</td></tr><tr><th>住所</th><td>福島県</td></tr><tr><th>最寄り駅</th><td>東北線</td></tr></table>~~(以後tableタグに囲まれているものと囲まれていないものが続く)

そこからこのようにハッシュに変換したものを配列に入れてこのようにしたいです。
{"場所"=>"家", "ナンバー"=>"〒000-0000", "住所"=>"東京都", "最寄り駅"=>"東海道線"}
{"場所"=>"会社", "ナンバー"=>"〒111-1111", "住所"=>"福島県", "最寄り駅"=>"東北線"}
~~(以後tableタグから抽出したハッシュが配列に入れられている)

どうすればよいか全くわからずとりあえず調べながらやったところ

ruby

1table = table.match(/\<table\>(\S+)\</table\>/).to_s 2 3p table 4# 出力結果 "<table><tr><th>場所</th><td>家</td></tr><tr><th>ナンバー</th><td>〒000-0000</td></tr><tr><th>住所</th><td>東京都</td></tr><tr><th>最寄り駅</th><td>東海道線</td></tr></table>" 5 6ary = table.split("</tr><tr>") 7 map{|pair| # <th>場所</th><td>家</td> 8 /<th>(.*)</th><td>(.*)</td>/ =~ pair 9 [$1,$2] 10 } 11h = Hash[*ary.flatten] 12answer = [h] 13 14p answer 15# 出力結果 {"場所"=>"家", "ナンバー"=>"〒000-0000", "住所"=>"東京都", "最寄り駅"=>"東海道線"}

このように一つ目のtableタグを抽出することはできたのですが、
matchメソッドで二個目以降のtableタグを抽出する方法が分からず、詰まってしまいました。
(+の部分を変えてみたりしましたが、自分の正規表現の理解が浅いためかわかりませんでした)
そのため、二個目以降のtableタグに囲まれた部分をどのような方法で抽出すればよいか教えていただきたいです。
わかりずらい質問かもしれませんが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下が参考になるのでは。

Ruby の正規表現を備忘録としてまとめてみたString#scan

第一引数にパターンを指定すると, そのパターンにマッチする文字列を一要素として, 配列を作ります:

'hello world'.scan(/\w+/) # => ["hello", "world"]

おそらく「最短マッチ」が必要です。

tables = table.scan(/<table>.*?</table>/)

こんな感じで、当該部分が配列に格納されるはず。

投稿2020/07/26 16:40

編集2020/07/26 16:59
KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroshiga

2020/07/27 00:49

とてもわかりやすい説明ありがとうございました。 scanメソッドを使ったらうまくできました!
guest

0

こんにちは

正規表現を使ってもできそうですが、nokogiri を使ってHTMLをパースすると、より楽に実現できるかもしれません。以下、その一例です。

ruby

1require 'nokogiri' 2 3 4html = <<-HTML 5<table> 6 <tr><th>場所</th><td></td></tr> 7 <tr><th>ナンバー</th><td>000-0000</td></tr> 8 <tr><th>住所</th><td>東京都</td></tr> 9 <tr><th>最寄り駅</th><td>東海道線</td></tr> 10</table> 11<h3 class="heading">東北地方</h3> 12<table> 13 <tr><th>場所</th><td>会社</td></tr> 14 <tr><th>ナンバー</th><td>111-1111</td></tr> 15 <tr><th>住所</th><td>福島県</td></tr> 16 <tr><th>最寄り駅</th><td>東北線</td></tr> 17</table> 18HTML 19 20result = Nokogiri::HTML.parse(html).search('table').map do |tbl| 21 %w(th td).map { |tag| tbl.search(tag).map(&:content) }.transpose.to_h 22end 23 24print(result) 25

投稿2020/07/26 16:19

編集2020/07/26 22:06
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroshiga

2020/07/27 00:50

回答ありがとうございます。 今回は使えないのですが nokogiriを使えるように勉強したいと思います!
jun68ykt

2020/07/27 07:19

どういたしまして???? 参考になれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問