2

Pythonで奇妙な解析の問題があります。次のテキストを解析する必要があります。

ここでは、「pre」タグと数字の列(205 4 164で始まる)の間のセクションのみが必要です。この形式のページがいくつかあります。

<html>
<pre>


A Short Study of Notation Efficiency

CACM August, 1960

Smith Jr., H. J.

CA600802 JB March 20, 1978  9:02 PM

205 4   164
210 4   164
214 4   164
642 4   164
1   5   164

</pre>
</html>
4

4 に答える 4

3

Quazi、これは、特に<pre>(.+?)(?:\d+\s+){3}DOTALLフラグが有効になっている正規表現を呼び出します。

Pythonで正規表現を使用する方法についてはhttp://docs.python.org/library/re.htmlを参照してください。この種の文字列抽出をたくさん行うと、とてもうれしくなります。提供された正規表現を1つずつ確認します。

<pre>プレタグの一致に直接一致し、いくつかの数字とそれに続くいくつかの空白に対して3回続けて一致
(.+?)する文字をキャプチャします
(?:\d+\s+){3}

于 2012-04-09T23:21:28.637 に答える
2

これを行うための正規表現は次のとおりです。

findData = re.compile('(?<=<pre>).+?(?=[\d\s]*</pre>)', re.S)

# ...

result = findData.search(data).group(0).strip()

これがデモです。

于 2012-04-09T23:25:58.057 に答える
2

私はおそらくlxmlまたはBeautifulSoupを使用します。IMO、正規表現は、特にHTMLの解析のために、ひどく酷使されています。

于 2012-04-09T23:42:06.697 に答える
1

他の人々は正規表現ソリューションを提供しました。これは良いですが、時々予期しない動作をする可能性があります。

ページが例に示されているとおりである場合、つまり次のようになります。

  • 他のHTMLタグは存在しません-<html><pre>タグのみ
  • 行数は常に一定です
  • 行間の間隔は常に一定です

次に、このような単純なアプローチで次のようになります。

my_text = """<html>
<pre>


A Short Study of Notation Efficiency

CACM August, 1960

Smith Jr., H. J.

CA600802 JB March 20, 1978  9:02 PM

205 4   164
210 4   164
214 4   164
642 4   164
1   5   164

</pre>
</html>"""

lines = my_text.split("\n")

title   = lines[4]
journal = lines[6]
author  = lines[8]
date    = lines[10]

行間の間隔を保証できないが、 ;内の最初の4つの非空白行のみが必要であることを保証できる場合。<html><pre>

import pprint

max_extracted_lines = 4
extracted_lines = []
for line in lines:
    if line == "<html>" or line == "<pre>":
        continue
    if line:
        extracted_lines.append(line)
    if len(extracted_lines) >= max_extracted_lines:
        break

pprint.pprint(extracted_lines)

出力を与える:

['A Short Study of Notation Efficiency',
 'CACM August, 1960',
 'Smith Jr., H. J.',
 'CA600802 JB March 20, 1978  9:02 PM']

単純な文字列操作で実行される正規表現は使用しないでください。

于 2012-04-10T00:10:21.357 に答える