পাইথনে স্ট্রিং স্লুগিফিকেশন


97

আমি "স্লগাইফাই" স্ট্রিং "স্লগ" কী তার সেরা পন্থায় অনুসন্ধান করছি এবং আমার বর্তমান সমাধানটি এই রেসিপিটির উপর ভিত্তি করে

আমি এটিকে কিছুটা পরিবর্তন করেছি:

s = 'String to slugify'

slug = unicodedata.normalize('NFKD', s)
slug = slug.encode('ascii', 'ignore').lower()
slug = re.sub(r'[^a-z0-9]+', '-', slug).strip('-')
slug = re.sub(r'[-]+', '-', slug)

এই কোডটি নিয়ে যে কোনও সমস্যা আছে? এটি ঠিকঠাক কাজ করছে, তবে সম্ভবত আমি কিছু মিস করছি বা আপনি আরও ভাল কোনও উপায় জানেন?


আপনি অনেকটা ইউনিকোড নিয়ে কাজ করছেন? যদি তাই হয় তবে আপনি যদি ইউনিকোড () এর চারপাশে আবদ্ধ করেন তবে শেষ পুনর্নির্মাণের সূচনাটি আরও ভাল হতে পারে, জাঞ্জো এটিই করে। এছাড়াও, [^ a-z0-9] + ব্যবহার করে ছোট করা যেতে পারে use w। django.template.defaultfilters দেখুন, এটি আপনার কাছাকাছি, তবে কিছুটা আরও পরিশ্রুত।
মাইক রামিরেজ

ইউনিকোডে ইউনিকোড অক্ষর অনুমোদিত? এছাড়াও, আমি \ w কে a-z0-9 এ পরিবর্তিত করেছি কারণ \ w এর মধ্যে _ অক্ষর এবং বড় হাতের অক্ষর রয়েছে। চিঠিগুলি আগাম ছোট ছোটতে সেট করা আছে, সুতরাং কোনও মিলের জন্য বড় হাতের অক্ষর থাকবে না।
জাইগিম্যান্টাস

'_' কার্যকর (তবে আপনার পছন্দটি, আপনি জিজ্ঞাসা করেছিলেন), ইউনিকোড শতাংশ এনকোডেড অক্ষর হিসাবে।
মাইক রামিরেজ

মাইকে ধন্যবাদ ঠিক আছে, আমি একটি ভুল প্রশ্ন জিজ্ঞাসা করেছি। যদি আমরা ইতোমধ্যে "আজ", "0-9" এবং "-" ব্যতীত সমস্ত অক্ষর প্রতিস্থাপন করে তবে ইউনিকোড স্ট্রিংটিতে এটি আবার এনকোড করার কোনও কারণ আছে কি?
জাইগিম্যান্টাস

জাঙ্গো-র জন্য, আমি বিশ্বাস করি যে এটি উপযুক্ততার জন্য ইউনিকোড অবজেক্ট হিসাবে সমস্ত স্ট্রিং থাকা তাদের কাছে গুরুত্বপূর্ণ। আপনি যদি এটি চান তবে এটি আপনার পছন্দ।
মাইক রামিরেজ

উত্তর:


146

এখানে একটি পাইথন প্যাকেজ রয়েছে python-slugify, যা স্লুগাইফাইয়ের বেশ ভাল কাজ করে:

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

আরও উদাহরণ দেখুন

আপনি যে পোস্ট করেছেন তার চেয়ে এই প্যাকেজটি আরও কিছু করে (উত্সটি একবার দেখুন, এটি কেবল একটি ফাইল)। প্রকল্পটি এখনও সক্রিয় রয়েছে (সাত বছর পরে আমি মূল উত্তর দেওয়ার 2 দিন আগে আপডেট হয়েছি (শেষবারে 2020-06-30 চেক করা হয়েছে), এটি এখনও আপডেট হয়)।

সাবধান : চারপাশে একটি দ্বিতীয় প্যাকেজ রয়েছে, নামকরণ করা হয়েছে slugify। আপনার যদি উভয় থাকে তবে আপনার সমস্যা হতে পারে, কারণ তাদের আমদানির জন্য একই নাম রয়েছে। সদ্য নামকরণকৃত slugifyব্যক্তিটি আমি দ্রুত যাচাই করা সমস্ত কিছুই করেনি: "Ich heiße"হয়ে ওঠে "ich-heie"(হওয়া উচিত "ich-heisse"), তাই pipবা ব্যবহার করার সময় সঠিকটি বেছে নেওয়ার বিষয়ে নিশ্চিত হন easy_install


6
python-slugifyএমআইটি-র অধীনে লাইসেন্সযুক্ত, তবে এটি Unidecodeজিপিএলের আওতায় লাইসেন্সপ্রাপ্ত যা ব্যবহার করে , তাই এটি কিছু প্রকল্পের জন্য উপযুক্ত নাও হতে পারে।
রোটারেটি

@ রোটারেটি আপনি কি দয়া করে আমার জন্য ব্যাখ্যা করতে পারেন কেন এটি সমস্ত প্রকল্পের জন্য উপযুক্ত নয়? আমরা কি এমআইটি বা জিপিএল লাইসেন্সের আওতায় কিছু ব্যবহার করতে এবং সেগুলি বাণিজ্যিক সফ্টওয়্যার এর অন্তর্ভুক্ত করতে পারি না? আমি মনে করি যে একমাত্র বিধিনিষেধটি আমাদের বিকাশকারী কোডগুলি ছাড়াও লাইসেন্স রাখা। আমি কি ভূল?
ঘাসেম তোফিঘি

4
@ ঘাসেমটফিফি সংক্ষেপে: আপনি এটি আপনার বাণিজ্যিক সফ্টওয়্যারটিতে ব্যবহার করতে পারেন, তবে আপনি যদি এটি ব্যবহার করেন তবে আপনাকে অবশ্যই আপনার কোডটি ওপেন করতে হবে। যাইহোক IANAL এবং এটি কোনও আইনি পরামর্শ নয়।
রোটারেটি

@ ঘাসেমটিফিফি সম্ভবত এই বিষয়টির উপর সফটওয়্যারেনজেনারিং.স্ট্যাকেক্সেঞ্জিং.
com

4
@ রোটারেটি python-slugifyএখন আপনার লাইসেন্স সম্পর্কিত উদ্বেগকে সম্বোধন text-unidecodeকরে জিপিএল-লাইসেন্সধারীর পরিবর্তে আর্টাস্টিক লাইসেন্সের ডিফল্ট হয়েছে Unidecodegithub.com/un33k/python-slugify/commit/…
এমিলিয়ান

31

ইউনিকোড সমর্থনের জন্য এখান থেকে ইউনিডিকোড ফর্ম ইনস্টল করুন

পাইপ ইনস্টল ইউনিিডকোড

# -*- coding: utf-8 -*-
import re
import unidecode

def slugify(text):
    text = unidecode.unidecode(text).lower()
    return re.sub(r'[\W_]+', '-', text)

text = u"My custom хелло ворлд"
print slugify(text)

>>> আমার কাস্টম-খেলো-ঘূর্ণি


4
হাই, এটি কিছুটা অদ্ভুত তবে এটি আমার প্রতিরোধের মতো দেয় "আমার কাস্টম-এনডুড-ডি-ডি3-4-ডি 2 ডি 3-4 ডি-ডি"
ডেরেভো

4
আপনি ইউনিকোড স্ট্রিং না পাঠালে @derevo খুশী হবে। প্রতিস্থাপন slugify("My custom хелло ворлд")সঙ্গে slugify(u"My custom хелло ворлд"), এবং এটি কাজ করা উচিত।
kratenko

9
আমি মত পরিবর্তনশীল নাম ব্যবহার করার বিরুদ্ধে পরামর্শ দিতে হবে str। এটি বিল্টিন strটাইপটি লুকায় ides
crodjer

4
ইউনিিডকোড হ'ল জিপিএল, যা কারওর জন্য উপযুক্ত নাও হতে পারে।
জর্জি লিটাও

পুনরায় সংশোধন বা বিচ্ছিন্নকরণ সম্পর্কে কী।
রায়ান চৌ চৌ

11

দুর্দান্ত পাইকার নাম রয়েছে পাইথন প্যাকেজ :

pip install awesome-slugify

এর মতো কাজ করে:

from slugify import slugify

slugify('one kožušček')  # one-kozuscek

অসাধারণ- slugify গিথাব পৃষ্ঠা


4
চমৎকার প্যাকেজ! তবে সাবধানতা অবলম্বন করুন, এটি জিপিএল এর আওতায় লাইসেন্সযুক্ত।
রোটারেটি

4
শিরোনাম: এটি আপনার ইউআরএলগুলি স্বয়ংক্রিয়ভাবে কমবে না) আপনি slugify(text).lower()যদি এটি চান চালানো প্রয়োজন ।
কালোব টালিয়েন

7

এটি জ্যাঙ্গোতে ভাল কাজ করে , তাই আমি দেখতে পাচ্ছি না কেন এটি একটি ভাল সাধারণ কাজের slugify ফাংশন হবে না।

এটি নিয়ে আপনার কোনও সমস্যা হচ্ছে?


এটি সম্ভব, এটি কিছু ক্ষেত্রে এটি প্যারানোয়ার স্বাস্থ্যকর ডোজ :-)
নেমেসিসফিক্সেক্স

কোডটি এখানে চলে গেছে
রায়লু

13
অলসদের জন্য:from django.utils.text import slugify
স্পার্টাকাস

6

সমস্যাটি আসকি নরমালাইনের লাইনের সাথে:

slug = unicodedata.normalize('NFKD', s)

একে ইউনিকোড নরমালাইজেশন বলা হয় যা প্রচুর পরিমাণে অক্ষরকে এসসিআই-তে ক্ষয় করে না। উদাহরণস্বরূপ, এটি নিম্নলিখিত স্ট্রিংগুলি থেকে অ-অ্যাস্কি অক্ষরগুলি কেটে ফেলবে:

Mørdag -> mrdag
Æther -> ther

এটি করার একটি আরও ভাল উপায় হ'ল ইউনিিডকোড মডিউলটি ব্যবহার করা যা স্ট্রিংগুলি এসএসআইতে রূপান্তরিত করার চেষ্টা করে। সুতরাং আপনি যদি উপরের লাইনটি এর সাথে প্রতিস্থাপন করেন:

import unidecode
slug = unidecode.unidecode(s)

আপনি উপরের স্ট্রিংগুলির জন্য এবং অনেক গ্রীক এবং রাশিয়ান অক্ষরের জন্যও আরও ভাল ফলাফল পেতে পারেন:

Mørdag -> mordag
Æther -> aether

6
def slugify(value):
    """
    Converts to lowercase, removes non-word characters (alphanumerics and
    underscores) and converts spaces to hyphens. Also strips leading and
    trailing whitespace.
    """
    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore').decode('ascii')
    value = re.sub('[^\w\s-]', '', value).strip().lower()
    return mark_safe(re.sub('[-\s]+', '-', value))
slugify = allow_lazy(slugify, six.text_type)

এটি django.utils.text এ উপস্থিত স্লগাইফাই ফাংশন এটি আপনার প্রয়োজনের জন্য যথেষ্ট হবে।


3

ইউনিিডকোড ভাল; তবে, সতর্কতা অবলম্বন করুন: ইউনিটিকোড হ'ল জিপিএল। যদি এই লাইসেন্সটি ফিট না হয় তবে এইটি ব্যবহার করুন


2

গিটহাবের কয়েকটি বিকল্প:

  1. https://github.com/dimka665/awesome-slugify
  2. https://github.com/un33k/python-slugify
  3. https://github.com/mozilla/unicode-slugify

প্রতিটি তার API এর জন্য কিছুটা পৃথক প্যারামিটার সমর্থন করে, তাই আপনি কী পছন্দ করেন তা খুঁজে বের করার জন্য আপনাকে তাকাতে হবে।

বিশেষত, নন-এএসসিআইআই অক্ষরগুলি মোকাবিলার জন্য তারা যে বিভিন্ন বিকল্প সরবরাহ করে সেদিকে মনোযোগ দিন। পাইদানি এই স্লাগাইফাইটিং লাইব্রেরিতে কিছু ইউনিকোড হ্যান্ডলিং পার্থক্যের চিত্র তুলে ধরে খুব সহায়ক একটি ব্লগ পোস্ট লিখেছিলেন: http://www.pydanny.com/awesome-slugify-human-readable-url-slugs-from-any-string.html এই ব্লগ পোস্টটি কিছুটা পুরানো কারণ মজিলারunicode-slugify আর জ্যাঙ্গো-নির্দিষ্ট নয়।

এছাড়াও নোট করুন যে বর্তমানে awesome-slugifyজিপিএলভি 3, যদিও সেখানে প্রকাশ্য সমস্যা রয়েছে যেখানে লেখক বলেছেন যে তারা এমআইটি / বিএসডি হিসাবে প্রকাশ করতে পছন্দ করবেন, বৈধতা সম্পর্কে ঠিক নিশ্চিত নন: https://github.com/dimka665/awesome-slugify/issues/ 24


1

আপনি শেষ পংক্তিতে পরিবর্তন বিবেচনা করতে পারেন

slug=re.sub(r'--+',r'-',slug)

যেহেতু নিদর্শনটি এর [-]+চেয়ে আলাদা -+নয় এবং আপনি কেবলমাত্র একটি হাইফেনের সাথে মিলিত হওয়ার বিষয়ে যত্নশীল হন না, কেবল দুটি বা আরও বেশি।

তবে অবশ্যই এটি বেশ গৌণ।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.