मैं व्हाट्सएप को अंडरस्कोर और इसके विपरीत कैसे बदलूं?


221

मैं अच्छा URL बनाने के लिए एक स्ट्रिंग में अंडरस्कोर के साथ व्हॉट्सएप को बदलना चाहता हूं। ताकि उदाहरण के लिए:

"This should be connected" becomes "This_should_be_connected" 

मैं Django के साथ पायथन का उपयोग कर रहा हूं। क्या इसे नियमित अभिव्यक्ति का उपयोग करके हल किया जा सकता है?


1
इसे django टेम्पलेट में कैसे प्राप्त किया जा सकता है। क्या सफेद जगहों को हटाने का कोई तरीका है । क्या ऐसा करने के लिए कोई टैग / फ़िल्टर बनाया गया है? नोट: slugifyवांछित आउटपुट नहीं देता है।
user1144616

जवाबों:


375

आपको नियमित अभिव्यक्ति की आवश्यकता नहीं है। पायथन में एक अंतर्निहित स्ट्रिंग विधि है जो आपको आवश्यक है:

mystring.replace(" ", "_")

29
यह अन्य व्हाट्सएप पात्रों, जैसे \ t या गैर-ब्रेकिंग स्पेस के साथ काम नहीं करता है।
रॉबर्टो बोनटलेट

12
हां, आप सही हैं, लेकिन पूछे गए प्रश्न के उद्देश्य के लिए, उन अन्य स्थानों को ध्यान में रखना आवश्यक नहीं लगता है।
रोजगारोपल

1
क्या मुझे काम करने के लिए कुछ भी आयात करने की आवश्यकता है? मुझे निम्न त्रुटि मिलती है: AttributeError: 'buildin_function_or_method' ऑब्जेक्ट का कोई गुण 'प्रतिस्थापित' नहीं है
Ocasta Eshu

2
संभवतः जिस चर को आपने प्रतिस्थापित किया है, वह स्ट्रिंग प्रकार नहीं था।
स्निग्धा बत्रा

4
यह उत्तर भ्रमित करने वाला हो सकता है, इसे मिस्ट्रींग = मिस्ट्रींग.रेप्लेस ("", "_") के रूप में बेहतर लिखा जा सकता है क्योंकि यह सीधे स्ट्रिंग को परिवर्तित नहीं करता है, बल्कि एक परिवर्तित संस्करण लौटाता है।
मेहदी

79

रिक्त स्थान बदलना ठीक है, लेकिन मैं सुझाव दे सकता हूं कि अन्य URL-शत्रु पात्रों को संभालने के लिए थोड़ा और आगे बढ़ें जैसे प्रश्न चिह्न, अपोस्ट्रोफ़, विस्मयादिबोधक बिंदु, आदि।

यह भी ध्यान दें कि एसईओ विशेषज्ञों के बीच आम सहमति यह है कि डैश 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!"))

यह दिलचस्प है। मैं इस सलाह का उपयोग जरूर करूंगा।
लुकास

Urlib.quote () को अपने urlify () के आउटपुट के लिए याद रखें - अगर एस में कुछ गैर-एससीआई है तो क्या होगा?
ज़गोडा

1
यह अच्छा है - लेकिन \ W के साथ पहली आरई भी व्हाट्सएप को इस परिणाम के साथ हटा देगा कि बाद की आरई को बदलने के लिए कुछ भी नहीं है ... यदि आप अपने अन्य पात्रों को '-' के बीच बदलना चाहते हैं तो टोकन पहले आरई के साथ बदलें। संकेत के रूप में एकल स्थान - यानी s = re.sub (r "\ W", '& nbsp', s) (यह StackOverflow पर एक shonky स्वरूपण मुद्दा हो सकता है: meta.stackexchange.com/questant/105507/… )
tiluki

2
@Triptych तुम्हारा मतलब क्या है? अफ्रीकी या यूरोपीय निगल?
तिलुकी

1
इसके साथ एक और मामूली समस्या यह है कि आप url में किसी भी preexisting hyphens को हटा देते हैं, ताकि यदि उपयोगकर्ता ने यह-स्वच्छ होने के लिए अपलोड करने से पहले url स्ट्रिंग को साफ़ करने का प्रयास किया था, तो इसे इसisclean पर हटा दिया जाएगा। तो s = re.sub (r '[^ \ w \ s-]', '', s)। एक कदम आगे जा सकते हैं और प्रमुख और अनुगामी व्हाट्सएप को हटा सकते हैं ताकि फ़ाइल नाम समाप्त न हो या s = re.sub (r '[^ \ w \ s-]', '', s .strip) के साथ एक हाइफ़न के साथ शुरू हो। ()
Intenex

42

Django में एक 'slugify' फंक्शन है जो ऐसा करता है, साथ ही अन्य URL- फ्रेंडली ऑप्टिमाइजेशन भी करता है। यह डिफ़ॉल्टफ़िल्टर मॉड्यूल में छिपा हुआ है।

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

this-should-be-connected

यह वास्तव में आपके द्वारा पूछे गए आउटपुट नहीं है, लेकिन IMO यह URL में उपयोग के लिए बेहतर है।


यह एक दिलचस्प विकल्प है, लेकिन क्या यह स्वाद का मामला है या अंडरस्कोर के बजाय हाइफ़न का उपयोग करने के क्या फायदे हैं। मैंने अभी देखा कि स्टैकओवरफ़्लो आपके सुझाव की तरह हाइफ़न का उपयोग करता है। लेकिन उदाहरण के लिए digg.com अंडरस्कोर का उपयोग करता है।
लुकास

यह पसंदीदा विकल्प (AFAIK) होता है। अपनी स्ट्रिंग लें, इसे धीमा करें, इसे SlugField में स्टोर करें, और अपने मॉडल के get_absolute_url () में इसका उपयोग करें। आप नेट पर उदाहरण आसानी से पा सकते हैं।
शांयू

3
@ लुलु लोग डैश का उपयोग करते हैं, क्योंकि लंबे समय से, खोज इंजन ने डैश को शब्द विभाजक के रूप में माना है और इसलिए आपको बहु-शब्द खोजों में आने वाला एक आसान समय मिलेगा।
जेम्स बेनेट

@ डैनियल रोजमैन क्या मैं इसे गतिशील रूप से चर के साथ उपयोग कर सकता हूं। जैसा कि मैं एक गतिशील वेबसाइट में स्ट्रिंग के रूप में मिल रहा हूं
अल्पकालिक

यह सही जवाब है। आपको अपने URL को सैनिटाइज़ करने की आवश्यकता है।
कैग्रॉनिक

40

यह अंतरिक्ष के अलावा रिक्त पात्रों को ध्यान में रखता है और मुझे लगता है कि यह reमॉड्यूल का उपयोग करने की तुलना में तेज़ है :

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

4
अधिक महत्वपूर्ण बात यह है कि यह किसी भी व्हाट्सएप चरित्र या व्हाट्सएप पात्रों के समूह के लिए काम करेगा।
दशहरा

यह समाधान सभी व्हाट्सएप पात्रों को संभालता नहीं है। (जैसे \x8f)
लोकल_प्रफिल

अच्छी पकड़, @Lokal_Profil! प्रलेखन निर्दिष्ट नहीं है जो खाली स्थान के वर्ण को ध्यान में रखा जाता है।
xOneca

1
यह समाधान दोहराए गए सीमांकक को भी संरक्षित नहीं करेगा, क्योंकि डिफ़ॉल्ट "व्हॉट्सएप पर विभाजन" का उपयोग करने पर खाली आइटम वापस नहीं आता है। यही है, यदि इनपुट "हैलो, (यहां 6 रिक्त स्थान) दुनिया" है, तो इसका परिणाम "हैलो, _वर्ल्ड" के बजाय "हैलो, ______ दुनिया" के रूप में होगा।
FliesLikeABrick

20

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उन लोगों के रूप में उपयोग करने की इच्छा कर सकते हैं जो दूसरों ने सुझाए हैं।


धन्यवाद, यह वही था जो मैं पूछ रहा था। लेकिन मैं मानता हूं, "string.replace" मेरे कार्य के लिए अधिक उपयुक्त है।
लुकास

बिल्ली क्या है, मेरा मतलब इसे उखाड़ना था, लेकिन किसी कारण से यह कम हो गया और अब मेरा वोट बंद है। क्षमा करें।
डेव लियू

10

स्ट्रिंग की जगह विधि का उपयोग करें:

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

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


6

आश्चर्यजनक रूप से इस पुस्तकालय का अभी तक उल्लेख नहीं किया गया है

अजगर पैकेज जिसे पायथन-स्लगिफ़ नाम दिया गया है, जो बहुत अच्छा काम करता है:

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") 

5

मैं अपने अनुकूल 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

यह यूनिकोड वर्णों के साथ भी ठीक काम करता है।


1
क्या आप बता सकते हैं कि यह बिल्ट-इन Django slugify फ़ंक्शन से कहां भिन्न है?
एंडी बेकर

4

पाइथन में स्ट्रिंग्स पर एक बिल्ट इन मेथड होता है जिसे रिप्लेस किया जाता है, जिसका उपयोग इस प्रकार किया जाता है:

string.replace(old, new)

तो आप उपयोग करेंगे:

string.replace(" ", "_")

मुझे कुछ समय पहले यह समस्या हुई थी और मैंने एक स्ट्रिंग में पात्रों को बदलने के लिए कोड लिखा था। मुझे अजगर के दस्तावेज़ीकरण की जांच करने के लिए याद करना शुरू करना होगा क्योंकि वे सब कुछ के लिए कार्यों में निर्मित हो गए हैं।


3

ओपी अजगर का उपयोग कर रहा है, लेकिन जावास्क्रिप्ट में (कुछ सावधान रहना होगा क्योंकि सिंटैक्स समान हैं।

// 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"

3
mystring.replace (" ", "_")

यदि आप किसी वैरिएबल को यह मान देते हैं, तो यह काम करेगा

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

डिफ़ॉल्ट रूप से रहस्यमय अभ्यस्त यह है



-3
perl -e 'map { $on=$_; s/ /_/; rename($on, $_) or warn $!; } <*>;'

वर्तमान एट निर्देशिका में मैच एट स्पेस की जगह> अंडरस्कोर मैच करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.