1

正規表現についてかなり基本的な質問があります。body タグ内 (および body タグを含む) のテキストを返したいだけですが、開始 body タグの前のすべての文字にも一致するため、次は正しくないことがわかっています。どうやってそれらをスキップするのだろうと思っていましたか?

x = re.match('(.*<body).*?(</body>)', fileString)

ありがとう!

4

6 に答える 6

9

私は Python を知りませんが、Python の HTML 解析に推奨されるBeautiful Soupを使用した簡単な例を次に示します。

import BeautifulSoup

soup = BeautifulSoup(fileString)

bodyTag = soup.html.body.string

それは(理論的には)HTMLのすべての複雑さに対処します。これは、正規表現が設計されたものではないため、純粋な正規表現ベースの回答では非常に困難です。

于 2009-10-25T13:32:09.440 に答える
2

<body>...</body>正規表現を使用してタグ間のすべてのテキストを検索するコードの例を次に示します。これは python の re モジュールのいくつかの機能を示していますが、Beautiful Soupモジュールは非常に使いやすく、HTML または XML の解析を計画している場合に使用するのに適したツールであることに注意してください。(BeautifulSoup を使用してこれを解析する方法の例については、以下を参照してください。)

#!/usr/bin/env python
import re

# Here we have a string with a multiline <body>...</body>
fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''

# re.DOTALL tells re that '.' should match any character, including newlines.
x = re.search('(<body>.*?</body>)', fileString, re.DOTALL)
for match in x.groups():
    print(match)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>

すべての一致を収集したい場合は、re.findall を使用できます。

print(re.findall('(<body>.*?</body>)', fileString, re.DOTALL))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']

このパターンを複数回使用する場合は、事前にコンパイルできます。

pat=re.compile('(<body>.*?</body>)', re.DOTALL)
print(pat.findall(fileString))
# ['<body>foo\nbaby foo\nbaby foo\nbaby foo\n</body>', '<body>bar</body>']

BeautifulSoup でそれを行う方法は次のとおりです。

#!/usr/bin/env python
from BeautifulSoup import BeautifulSoup

fileString='''baz<body>foo
baby foo
baby foo
baby foo
</body><body>bar</body>'''
soup = BeautifulSoup(fileString)
print(soup.body)
# <body>foo
# baby foo
# baby foo
# baby foo
# </body>

print(soup.findAll('body'))
# [<body>foo
# baby foo
# baby foo
# baby foo
# </body>, <body>bar</body>]
于 2009-10-25T13:18:43.150 に答える
0

HTML を正規表現で解析することはできません。HTML は通常の言語ではありません。代わりに lxml のような HTML パーサーを使用してください。

于 2009-10-25T15:50:23.233 に答える
-2

fileString に複数の行が含まれていますか? その場合、それを指定するか、明示的に行をスキップする必要があるかもしれません:

x = re.match(r"(?:.|\n)*(<body>(?:.|\n)*</body>)", fileString)

または、より簡単に re モジュールを使用します。

x = re.match(r".*(<body>.*</body>)", fileString, re.DOTALL)

x.groups()[0]x が None でない場合、文字列を含める必要があります。

于 2009-10-25T13:41:02.997 に答える
-2
 x = re.match('.*(<body>.*?</body>)', fileString)

HTML 解析には minidom を検討してください。

于 2009-10-25T13:18:22.853 に答える
-2
x = re.search('(<body>.*</body>)', fileString)
x.group(1)

マッチの答えよりタイピングが少ない

于 2009-10-25T13:25:40.817 に答える