Câu trả lời:
Bạn không cần biểu thức chính quy. Python có một phương thức chuỗi dựng sẵn thực hiện những gì bạn cần:
mystring.replace(" ", "_")
Thay thế khoảng trắng là tốt, nhưng tôi có thể khuyên bạn nên đi xa hơn một chút để xử lý các ký tự thù địch URL khác như dấu chấm hỏi, dấu nháy đơn, dấu chấm than, v.v.
Cũng lưu ý rằng sự đồng thuận chung giữa các chuyên gia SEO là dấu gạch ngang được ưu tiên cho dấu gạch dưới trong 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 có chức năng 'slugify' thực hiện điều này, cũng như các tối ưu hóa thân thiện với URL khác. Nó được ẩn đi trong mô-đun defaultfilters.
>>> from django.template.defaultfilters import slugify
>>> slugify("This should be connected")
this-should-be-connected
Đây không chính xác là đầu ra mà bạn yêu cầu, nhưng IMO sẽ tốt hơn khi sử dụng URL.
Điều này tính đến các ký tự trống ngoài không gian và tôi nghĩ nó nhanh hơn sử dụng re
mô-đun:
url = "_".join( title.split() )
\x8f
)
Sử dụng re
mô-đun:
import re
re.sub('\s+', '_', "This should be connected") # This_should_be_connected
re.sub('\s+', '_', 'And so\tshould this') # And_so_should_this
Trừ khi bạn có nhiều khoảng trắng hoặc các khả năng khoảng trắng khác như trên, bạn có thể chỉ muốn sử dụng string.replace
như những người khác đã đề xuất.
Đáng ngạc nhiên là thư viện này chưa được đề cập
gói python có tên python-slugify, một công việc khá tốt của slugifying:
pip install python-slugify
Hoạt động như thế này:
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")
Tôi đang sử dụng đoạn mã sau cho các url thân thiện của mình:
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
Nó hoạt động tốt với các ký tự unicode là tốt.
Python có một phương thức dựng sẵn trên các chuỗi gọi là thay thế được sử dụng như vậy:
string.replace(old, new)
Vì vậy, bạn sẽ sử dụng:
string.replace(" ", "_")
Tôi đã có vấn đề này một thời gian trước đây và tôi đã viết mã để thay thế các ký tự trong một chuỗi. Tôi phải bắt đầu nhớ kiểm tra tài liệu python vì chúng đã được tích hợp sẵn các chức năng cho mọi thứ.
OP đang sử dụng python, nhưng trong javascript (một điều cần cẩn thận vì các cú pháp tương tự nhau.
// 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"
Bạn có thể thử điều này thay thế:
mystring.replace(r' ','-')
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
Khớp et thay thế không gian> gạch dưới của tất cả các tệp trong thư mục hiện tại
slugify
không cho đầu ra mong muốn.