正規表現についてかなり基本的な質問があります。body タグ内 (および body タグを含む) のテキストを返したいだけですが、開始 body タグの前のすべての文字にも一致するため、次は正しくないことがわかっています。どうやってそれらをスキップするのだろうと思っていましたか?
x = re.match('(.*<body).*?(</body>)', fileString)
ありがとう!
正規表現についてかなり基本的な質問があります。body タグ内 (および body タグを含む) のテキストを返したいだけですが、開始 body タグの前のすべての文字にも一致するため、次は正しくないことがわかっています。どうやってそれらをスキップするのだろうと思っていましたか?
x = re.match('(.*<body).*?(</body>)', fileString)
ありがとう!
私は Python を知りませんが、Python の HTML 解析に推奨されるBeautiful Soupを使用した簡単な例を次に示します。
import BeautifulSoup
soup = BeautifulSoup(fileString)
bodyTag = soup.html.body.string
それは(理論的には)HTMLのすべての複雑さに対処します。これは、正規表現が設計されたものではないため、純粋な正規表現ベースの回答では非常に困難です。
<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>]
HTML を正規表現で解析することはできません。HTML は通常の言語ではありません。代わりに lxml のような HTML パーサーを使用してください。
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 でない場合、文字列を含める必要があります。
x = re.match('.*(<body>.*?</body>)', fileString)
HTML 解析には minidom を検討してください。
x = re.search('(<body>.*</body>)', fileString)
x.group(1)
マッチの答えよりタイピングが少ない