web-dev-qa-db-ja.com

空白をアンダースコアに、またはその逆に置き換えるにはどうすればよいですか?

ナイスURLを作成するために、文字列の空白をアンダースコアに置き換えたいです。そのため、たとえば:

"This should be connected" becomes "This_should_be_connected" 

DjangoでPythonを使用しています。これは正規表現を使用して解決できますか?

170
Lucas

正規表現は必要ありません。 Pythonには、必要なことを実行する組み込みの文字列メソッドがあります。

mystring.replace(" ", "_")
290
rogeriopvl

スペースを置き換えることは問題ありませんが、疑問符、アポストロフィ、感嘆符など、URLに敵対する他の文字を処理するためにもう少し進むことをお勧めします。

また、SEOの専門家の間での一般的なコンセンサスは、 RLのアンダースコアよりもダッシュの方が望ましい

import re

def urlify(s):

    # Remove all non-Word characters (everything except numbers and letters)
    s = re.sub(r"[^\w\s]", '', s)

    # Replace all runs of whitespace with a single dash
    s = re.sub(r"\s+", '-', s)

    return s

# Prints: I-cant-get-no-satisfaction"
print(urlify("I can't get no satisfaction!"))
65
Triptych

Djangoには、これを行う「slugify」機能と、他のURLフレンドリーな最適化機能があります。 defaultfiltersモジュールに隠されています。

>>> from Django.template.defaultfilters import slugify
>>> slugify("This should be connected")

this-should-be-connected

これはまさにあなたが求めた出力ではありませんが、IMOはURLでの使用に適しています。

39
Daniel Roseman

これはスペース以外の空白文字を考慮し、reモジュールを使用するよりも高速だと思います。

url = "_".join( title.split() )
33
xOneca

reモジュールの使用:

import re
re.sub('\s+', '_', "This should be connected") # This_should_be_connected
re.sub('\s+', '_', 'And     so\tshould this')  # And_so_should_this

上記のように複数のスペースまたは他の空白の可能性がある場合を除いて、他の人が提案したようにstring.replaceを使用したいだけです。

16
Jarret Hardie

文字列の置換メソッドを使用します。

"this should be connected".replace(" ", "_")

"this_should_be_disconnected".replace("_", " ")

10
mdirolf

わかりやすいURLに次のコードを使用しています。

from unicodedata import normalize
from re import sub

def slugify(title):
    name = normalize('NFKD', title).encode('ascii', 'ignore').replace(' ', '-').lower()
    #remove `other` characters
    name = sub('[^a-zA-Z0-9_-]', '', name)
    #nomalize dashes
    name = sub('-+', '-', name)

    return name

Unicode文字でも問題なく動作します。

5
Armandas

驚いたことに、このライブラリはまだ言及されていません

python-slugifyという名前のpythonパッケージは、スラッグ化の非常に良い仕事をします:

pip install python-slugify

このように動作します:

from slugify import slugify

txt = "This is a test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")

txt = "This -- is a ## test ---"
r = slugify(txt)
self.assertEquals(r, "this-is-a-test")

txt = 'C\'est déjà l\'été.'
r = slugify(txt)
self.assertEquals(r, "cest-deja-lete")

txt = 'Nín hǎo. Wǒ shì zhōng guó rén'
r = slugify(txt)
self.assertEquals(r, "nin-hao-wo-shi-zhong-guo-ren")

txt = 'Компьютер'
r = slugify(txt)
self.assertEquals(r, "kompiuter")

txt = 'jaja---lol-méméméoo--a'
r = slugify(txt)
self.assertEquals(r, "jaja-lol-mememeoo-a") 
4
Yash

Pythonには、replaceと呼ばれる文字列の組み込みメソッドがあり、次のように使用されます。

string.replace(old, new)

だからあなたは使用します:

string.replace(" ", "_")

しばらく前にこの問題があり、文字列の文字を置き換えるコードを書きました。 pythonのドキュメントをチェックすることを忘れないでください。すべての機能が組み込まれているからです。

4
Ionis
mystring.replace (" ", "_")

この値を任意の変数に割り当てると、機能します

s = mystring.replace (" ", "_")

デフォルトではmystringはこれを持っていません

3
Rajesh

OPはpythonを使用していますが、javascript(構文が似ているため注意が必要なもの)です。

// only replaces the first instance of ' ' with '_'
"one two three".replace(' ', '_'); 
=> "one_two three"

// replaces all instances of ' ' with '_'
"one two three".replace(/\s/g, '_');
=> "one_two_three"
2
twmulloy

代わりにこれを試すことができます:

mystring.replace(r' ','-')
1
Meghaa Yadav