0

重複の可能性:
正規表現は、XHTML自己完結型タグを除くオープンタグと一致します

Pythonで正規表現を使用<td>して複数のデータを1つにマッピングする必要があります<tr>

例えば

<tr>
  <td>data 1</td>
  <td>data 2</td>
  <td>data 3</td>
</tr>

単一の正規表現を使用してdata1、data2、data3を抽出したいと思います。<td>また、タグはいくつでもかまいません。

現在、複数の正規表現を使用しています。つまり、最初にマッピング<tr></tr>してから、次に<td></td>

単一の表現でそれを行うことはできますか?

正規表現を使用してこれを実現したいので、美しいスープや他のhtmlパーサーを使用できません。

4

2 に答える 2

3

他の人が示唆しているように、タスク用に設計されたもので HTML を解析する必要がありますが、以下はケースのサブセットで機能します。

re.findall(r'(?i)<td.*?>([^<]+)</td.*?>', input_str)

HTML 入力の形式によっては、 を使用する前に文字列に変換する必要がある場合がありますre.findall()。以下は、一致するものを読み取りfile.html、 というリストに保存しますdata

import re

fh = open('file.html', 'r')
input_str = fh.read()
data = re.findall(r'(?i)<td.*?>([^<]+)</td.*?>', input_str)
fh.close()
于 2012-09-04T18:52:10.877 に答える
2

編集:わかりました、ポニー、彼が来ます。私もその意見に完全に同意するので、時々その言葉を広めます。しかし、その見解は上記のコメントで十分に表現されているように見えたので、文字通りの質問に単純に答えようとしました。簡単に言うと、「いいえ、.NET を除いて、先に進んでください。」


実際の質問に答えるには:

いいえ、.NET を使用していない限り、単一の式でそれを行うことはできません。.NET は、数量化された式内で一致する各インスタンスのキャプチャを提供すると聞いています。

あなたができる最善のことは、有限で任意ではない繰り返しです。

 /<tr>(?:\s*<td>(.*?)</td>)?(?:\s*<td>(.*?)</td>)?(?:\s*<td>(.*?)</td>)?(?:\s*<td>(.*?)</td>)?\s*</tr>/

もちろん、上記は大まかなものであり、他のタグやコメントなどは考慮されていません。「有限で任意ではない」部分を例示しているだけです。

于 2012-09-04T15:43:48.500 に答える