ฉันต้องการแทนที่ช่องว่างด้วยการขีดเส้นใต้ในสตริงเพื่อสร้าง URL ที่ดี ตัวอย่างเช่น:
"This should be connected" becomes "This_should_be_connected"
ฉันใช้ Python กับ Django สิ่งนี้สามารถแก้ไขได้ด้วยการแสดงออกปกติ?
ฉันต้องการแทนที่ช่องว่างด้วยการขีดเส้นใต้ในสตริงเพื่อสร้าง URL ที่ดี ตัวอย่างเช่น:
"This should be connected" becomes "This_should_be_connected"
ฉันใช้ Python กับ Django สิ่งนี้สามารถแก้ไขได้ด้วยการแสดงออกปกติ?
คำตอบ:
คุณไม่ต้องการการแสดงออกปกติ 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 อื่น ๆ มันถูกซ่อนอยู่ในโมดูลตัวกรองเริ่มต้น
>>> 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
ตามที่คนอื่นแนะนำ
ใช้วิธีการแทนที่สตริง:
"this should be connected".replace(" ", "_")
"this_should_be_disconnected".replace("_", " ")
น่าแปลกที่ห้องสมุดนี้ยังไม่ได้กล่าวถึง
แพคเกจหลามชื่อ python-slugify ซึ่งทำได้ค่อนข้างดีในการเป็น 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(" ", "_")
ฉันมีปัญหานี้มาแล้วและฉันเขียนโค้ดเพื่อแทนที่อักขระในสตริง ฉันต้องเริ่มจำเพื่อตรวจสอบเอกสารหลามเพราะพวกมันสร้างฟังก์ชั่นสำหรับทุกสิ่ง
OP ใช้ python แต่เป็นจาวาสคริปต์ (สิ่งที่ต้องระวังเนื่องจากไวยากรณ์มีความคล้ายคลึงกัน
// 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"
mystring.replace (" ", "_")
หากคุณกำหนดค่านี้ให้กับตัวแปรใด ๆ มันจะทำงาน
s = mystring.replace (" ", "_")
โดยค่าเริ่มต้น mystring จะไม่มีสิ่งนี้
คุณสามารถลองสิ่งนี้แทน:
mystring.replace(r' ','-')
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'
จับคู่และแทนที่ช่องว่าง> ขีดล่างของไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน
slugify
ไม่ได้ให้ผลลัพธ์ที่ต้องการ