0

Python 2.7.3、urllib、および re を使用して、以下を含む URL を探しています。

href="/dirone/Dir_Two/dirthree/"

URL は次のようになります。

href="/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers"

そして戻りたい:

"/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers"

このツールを使用して:

http://www.jslab.dk/tools.regex.php

私は正規表現を次のように生成しました:

/^href\="\/dirone\/Dir_Two\/dirthree\/"$/im

したがって、この正規表現を python および re で次のように使用できますか。

object_name = re.findall('/^href\="\/dirone\/Dir_Two\/dirthree\/"$/im',url)
for single_url in object_name:
    do something
4

2 に答える 2

2

あなたは本当に^アンカーを落としたいと思っています。が行頭にhrefなることはないと思います。

/imこの部分は必要ありませんre.。フラグ定数に置き換える必要があります。そこには Perl の正規表現構文がありますが、Python には特殊な構文がありません/.../flags

そのため、エスケープが多すぎて、実際の Python 文字列がありません。5678-random-stuff-here-letters-and-numbersそして、実際にはその部分を含めません。

代わりにこれを使用してください:

object_name = re.findall(r'href="(/dirone/Dir_Two\/dirthree/[^"/]*)"', url, re.I)

.を削除した文字列の先頭で一致しなくなったため、複数行フラグを削除しました^(...)パスの周りにグループ ( ) を追加して、findall()一致全体ではなくそれらを返すようにしました。この[^"/]*部分は、引用符またはスラッシュ以外の任意の文字に一致して、ファイル名部分をキャプチャしますが、別のディレクトリ名には一致しません。

短いデモ:

>>> import re
>>> example = '<a href="/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers">'
>>> re.findall(r'href="(/dirone/Dir_Two\/dirthree/[^"/]*)"', example, re.I)
['/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers']
于 2013-04-06T08:18:23.627 に答える
2

Martijn の回答に似ていbeautifulsoupますが、HTML があると仮定して使用します。

data = '<a href="/dirone/Dir_Two/dirthree/5678-random-stuff-here-letters-and-numbers">Content</a>'

from bs4 import BeautifulSoup
import re

soup = BeautifulSoup(data)
print [el['href'] for el in soup('a', href=re.compile('^/dirone/Dir_Two/.*'))]
于 2013-04-06T08:32:06.503 に答える