回答:
正規表現は必要ありません。Pythonには、必要なことを行う組み込みの文字列メソッドがあります。
mystring.replace(" ", "_")
スペースの置き換えは問題ありませんが、疑問符、アポストロフィ、感嘆符など、他のURLに悪意のある文字をもう少し処理することをお勧めします。
また、SEO専門家の間の一般的なコンセンサスは、ダッシュはURLのアンダースコアよりも好ましいということです。
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!"))
Djangoには、これを行う「slugify」機能と、他のURLフレンドリーな最適化があります。これはdefaultfiltersモジュールに隠されています。
>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")
this-should-be-connected
これは正確にあなたが求めた出力ではありませんが、IMOはURLでの使用に適しています。
これはスペース以外の空白文字を考慮しており、re
モジュールを使用するよりも高速だと思います:
url = "_".join( title.split() )
\x8f
)
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
、他の人が提案したように使用したいだけかもしれません。
驚いたことに、このライブラリはまだ言及されていません
python-slugifyという名前のpythonパッケージは、slugifyingのかなり良い仕事をします:
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")
私のフレンドリーな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
ユニコード文字でも同様に機能します。
Pythonには、replaceと呼ばれる文字列の組み込みメソッドがあり、次のように使用されます。
string.replace(old, new)
だからあなたは使うでしょう:
string.replace(" ", "_")
しばらく前にこの問題があり、文字列の文字を置き換えるコードを書きました。すべての関数が組み込まれているため、Pythonのドキュメントを確認することを忘れないでください。
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
スペースの一致と置換>現在のディレクトリ内のすべてのファイルの下線
slugify
は目的の出力を提供しません。