0

として保存されているURLがありtype=strます。次のようになります。

url = 'http://www.dog.com/bone?junk=8dj37hf7'

「?」で始まるすべての文字を削除したいので、次のようにします。

url = 'http://www.dog.com/bone'

これは私が試したことです:

import re
re.sub('?junk=*', '', url)

しかし、私はこのエラーが発生します:

raise error, v # 無効な式 sre_constants.error: 何も繰り返さない

これが解決策です:

import re
re.sub('\?junk=.*', '', url)

コードブラケットを挿入するように編集されました。Morten Jensen に従って .* 表記を追加するように編集しましたが、エラーは解決しません。

編集:「.*」および「\」エスケープで解決。Morten Jensen、jwodder、thefourtheye などに感謝します。

4

5 に答える 5

5

なぜだけではない

url = url.split("?",1)[0]

正規表現は、ここでハンマーでハエを殺そうとしているようです

于 2013-11-07T01:08:28.237 に答える
1

http://docs.python.org/2/library/re.html#regular-expression-syntaxからの引用

'?'

結果の RE は、前の RE の 0 回または 1 回の繰り返しと一致します。アブ?'a' または 'ab' のいずれかに一致します。

?したがって、バックスラッシュでエスケープする必要があります

url = 'http://www.dog.com/bone?junk=8dj37hf7'
import re
print re.sub('\?.*', '', url)

出力

http://www.dog.com/bone
于 2013-11-07T01:01:53.703 に答える
1

URL を解析したい場合は、urlparseの方が適しています。

from urlparse import urlparse

url = 'http://www.dog.com/bone?junk=8dj37hf7'
parsed = urlparse(url)
real_url = "http://{0}{1}".format(parsed.hostname, parsed.path)

出力:

'http://www.dog.com/bone'
于 2013-11-07T01:16:43.123 に答える
1

エラーは?、正規表現では直前の項目がオプションになるためですが、ここには先行する項目がありません。この動作を回避するには、バックスラッシュでエスケープする必要があり?ます。同様に、=*は 0 個以上=の s に一致=します=.*。したがって、必要なものを取得するには、次を使用する必要があります。

re.sub(r'\?junk=.*', '', url)
于 2013-11-07T01:03:40.087 に答える
1

thefourthey が言ったこと、またはおそらくこれを試すことができます。

>>> url = 'http://www.dog.com/bone?junk=8dj37hf7'
>>> newurl = url[:url.find('?')]
>>> print newurl

http://www.dog.com/bone

この方法も高速です。証明を次に示します。

In [2]: url = 'http://www.dog.com/bone?junk=8dj37hf7'

In [3]: %timeit newurl = url[:url.find('?')]
1000000 loops, best of 3: 423 ns per loop

In [4]: import re

In [5]: %timeit x = re.sub('\?.*', '', url)
100000 loops, best of 3: 3.1 us per loop

In [6]: %timeit x = re.sub('\?.*', '', url)
100000 loops, best of 3: 3.25 us per loop
于 2013-11-07T01:04:08.723 に答える