ترفندهای جذاب پایتون
چگونه در پایتون با رشته‌ها کار کنیم؟
رشته‌ها یکی از مولفه‌های مهم دنیای برنامه‌نویسی هستند. به همین دلیل زبان‌های برنامه‌نویسی روش‌های مختلفی برای دستکاری رشته‌ها در اختیار توسعه‌دهندگان قرار می‌دهند. پایتون نیز از این قاعده مستثنا نیست و به توسعه‌دهندگان اجازه می‌دهد به شیوه‌های مختلفی رشته‌ها را دستکاری کنند. در این مطلب به معرفی ترفندهایی می‌پردازیم که برای دستکاری رشته‌ها در دسترس توسعه‌دهندگان قرار دارند.

دستکاری رشته‌ها کاری است که برنامه‌نویسان مختلف به شکل گسترده انجام می‌دهند. بر همین اساس در این مطلب با 22 ترفند پایتون که برای کار با رشته‌ها استفاده می‌شوند آشنا می‌شوید. مثال‌های ارائه شده در این مطلب منطبق با نگارش 2.8.2 پایتون هستند.

پیدا کردن یک عبارت درون یک رشته

با استفاده از عملگر مقایسه‌ای پایتون به نام in می‌توان متوجه شد که آیا یک رشته درون یک رشته دیگر وجود دارد یا خیر. عملگر فوق مقدار true یا false را بر می‌گرداند.

def sub_00(haystack: str="", needle:str="") -> bool:

    return needle in haystack

 

assert sub_00("the quick brown fox jumped over the lazy dog", "lazy") == True

assert sub_00("the quick brown fox jumped over the lazy dog", "lazys") == False

معکوس کردن یک رشته

با تغییر یک گام کاشی برای عملگر slice می‌توانیم یک رشته را معکوس کنیم.

def string_reverse(forward: str = "") -> str:

    return forward[::-1]

 

assert string_reverse("hello") == "olleh"

assert string_reverse("goodbye") != "goodbye"

بررسی یکسان بودن دو رشته

برای بررسی برابر بودن دو رشته از عملگر == استفاده می‌شود که نشان می‌دهد دو شی مقدار یکسانی دارند یا خیر. همچنین، برای مقایسه هویت از عملگر is استفاده می‌کنیم تا ببینیم دو شی یکسان هستند یا خیر.

def are_equal(first_comparator: str = "", second_comparator: str = "") -> bool:

    return first_comparator == second_comparator

 

 

assert are_equal("thing one", "thing two") is False

assert are_equal("a thing", "a " + "thing") is True

حالت‌های مختلف کوچکی و بزرگی حروف در رشته‌ها

پایتون یکسری توابع از پیش ساخته دارد که با استفاده از آن‌ها می‌توان حالت حروف در یک رشته را تغییر داد.

def to_uppercase(input_string:str) -> str:

    return input_string.upper()

 

def to_lowercase(input_string:str) -> str:

    return input_string.lower()

 

def to_sentencecase(input_string:str) -> str:

    return input_string.capitalize()

 

def to_titlecase(input_string:str) -> str:

    return input_string.title()

 

def to_swapcase(input_string:str) -> str:

    return input_string.swapcase()

 

assert to_uppercase("the end of time") == "THE END OF TIME"

assert to_lowercase("The End Of Time") == "the end of time"

assert to_sentencecase("The End of Time") == "The end of time"

assert to_titlecase("the end of time") == "The End Of Time"

assert to_swapcase("The End Of Time") == "tHE eND oF tIME"

اتصال قدرتمند رشته‌ها به یکدیگر

با استفاده از join روی یک رشته حالی پارامترها به یکدیگر متصل می‌شوند. این تابع تعداد متغیری از آرگومان‌ها را با استفاده از نشانگر * دریافت می‌کند.

def concatenate(*argv)->str:

    return ''.join(argv)

 

 

assert concatenate("a", "b", "c") == "abc"

بررسی خالی بودن رشته

یک شی string عادی می‌توان هیچ کاراکتری نداشته باشد یا همه کارهای آن فضای خالی باشند یا حتا یک شی از نوع None باشد. برای بررسی این موضوع باید از تابعی استفاده کنید تا بررسی که آیا رشته شامل محتوای کاراکتری یا بایتی است. قطعه کد زیر این موضوع را نشان می‌دهد.

def is_null_or_blank(input_string: str = "") -> bool:

 

    if input_string:

        if input_string.strip():

            return False

    return True

 

 

assert is_null_or_blank(None) == True

assert is_null_or_blank("") == True

assert is_null_or_blank("  ") == True

assert is_null_or_blank(" d ") == False

حذف فضاهای خالی ابتدا و انتهار رشته

تابع زیر یک مقدار سه‌تایی بر می‌گرداند که هر عصر آن شامل یک نسخه از رشته اصلی است، اما در هر کدام از آن‌ها فضاهای خالی رشته به شکل ترتیبی از هم جدا شده‌اند. همان‌گونه که مشاهده می‌کنید پایتون گزاره‌هایی که مقدار را به متغیرهای چندگانه نسبت می‌دهند را به خوبی تشخیص می‌دهد.

def strip_it(input_string: str) -> tuple:

 

    return (input_string.lstrip(), input_string.rstrip(), input_string.strip())

 

 

left, right, full = strip_it("  A padded  string   ")

assert left == "A padded  string   "

assert right == "  A padded  string"

assert full == "A padded  string"

ساخت یک رشته از کاراکترهای تصادفی

امکان به‌کارگیری ماژول secrets برای ساخت گزینه‌های تصادفی از کاراکترها و اضافه کردن آن‌ها به یک رشته وجود دارد. قطعه کد زیر این موضوع را نشان می‌دهد.

import string

import secrets

 

 

def generate_random_string(length: int = 0) -> str:

    result = "".join(

        secrets.choice(string.ascii_letters + string.digits)

        for _ in range(length))

    return result

 

 

assert len(generate_random_string(20)) == 20

خواندن خطوط یک فایل به یک فهرست

در کد زیر شی فایل‌خوان f به شکل صریح به یک فهرست تبدیل شده است. دقت کنید که فایل را در حالت r به معنای فقط خواندنی (read-only) باز نکرده‌ایم.

def file_to_list(filename: str = "") -> list:

 

    with open(filename, "r") as f:

        lines = list(f)

 

    return lines

 

 

assert len(file_to_list("<PATH TO FILE>")) == LINE_COUNT

نشانه‌گذاری کامل یک جمله

نشانه‌گذاری یک روش در پردازش طبان عادی است که در آن تمامی نشانه‌ها در یک جمله همانند علایم سجاوندی برگشت داده می‌شوند. در کد زیر از NLTK استفاده کرده‌یم که باید به شکل مجزا نصب شود.

import nltk

 

 

def tokenize_text(input_str: str = "") -> list:

    return nltk.wordpunct_tokenize(input_str)

 

 

assert tokenize_text("Good muffins cost $3.88\nin New York.") == [

    "Good",

    "muffins",

    "cost",

    "$",

    "3",

    ".",

    "88",

    "in",

    "New",

    "York",

    ".",

]

اجرای کد پایتون موجود در یک رشته

در این بخش دو راه‌حل برای اجرای یک کد که درون یک رشته قرار دارند نشان داده شده است. متد exec_string محتوای یک رشته را برای سیستم‌عامل ارسال می‌کند. متد eval_string از پایتون برای ارزیابی رشته استفاده می‌کند. در ارتباط با استفاده از هر دو راه‌حل دقت کنید، زیرا ممکن اشت رشته‌هایی که پردازش می‌کنید شامل کدهای مخرب باشند.

import subprocess

import ast

 

 

def exec_string(input_string: str = "") -> str:

    result = subprocess.getoutput(input_string)

    return result

 

 

def eval_string(input_string: str = "") -> str:

    result = ast.literal_eval(input_string)

    return str(result)

 

 

assert exec_string("ls -l")

assert eval_string("{ 'key':'value' }") == "{'key': 'value'}"

پیدا کردن عبارت بین دو علامت

برای انجام این‌کار بهتر است از عبارت‌های منظم (regular expressions) و F-String استفاده شود.

import re

 

 

def between(first: str = "", second: str = "", input_string="") -> str:

    

    m = re.search(f"{first}(.+?){second}", input_string)

    if m:

        return m.group(1)

 

    else:

        return ""

 

 

assert between(input_string="adCCCTHETEXTZZZdfhewihu",

               first="CCC",

               second="ZZZ") == "THETEXT"

حذف علایم سجاوندی از یک رشته

این ماژول شامل فهرستی از کاراکترهای سجاوندی است. با استفاده از translate می‌توانیم آن‌ها را از یک رشته حذف کنیم.

import string

 

 

def remove_punctuation(input_string: str = "") -> str:

    return input_string.translate(str.maketrans("", "", string.punctuation))

 

 

assert remove_punctuation("Hello!") == "Hello"

assert remove_punctuation("He. Saw! Me?") == "He Saw Me"

کدگذاری و از کد خارج کردن آدرس‌های اینترنتی UTF-8

UTF-8 اجازه می‌دهد از کاراکترهای توسعه یافته و دابل ورد همچون ایموجی‌ها استفاده کنیم. این کاراکترها پیش از آن که در یک آدرس اینترنتی استفاده شوند ابتدا باید کدگذاری شوند.

import urllib.parse

 

 

def encode_url(url: str = "") -> str:

    return urllib.parse.quote(url)

 

 

def decode_url(url: str = "") -> str:

    return urllib.parse.unquote(url)

 

 

assert (encode_url("example.com?title=¨ˆπœ˚∑π") ==

        "example.com%3Ftitle%3D%C2%A8%CB%86%CF%80%C5%93%CB%9A%E2%88%91%CF%80")

assert decode_url("example.com?title=%a0%f7%b1") == "example.com?title=���"

به‌کارگیری سیستم کد‌گذاری Base64 روی رشته‌ها

Base64 یک روش کدگذاری داده‌های دودویی به شکل یک رشته و انتقال رشته در قالب یک پیام متنی است. از راه‌کار فوق می‌تواند برای کدگذاری رشته‌های UTF-8 نیز استفاده کرد.

import base64

 

 

def encode_b64(input_string: str = "") -> object:

    return base64.b64encode(input_string.encode("utf-8"))

 

 

def decode_b64(input_string: str = "") -> object:

    return base64.b64decode(input_string).decode("utf-8")

 

 

assert encode_b64("Hello") == b"SGVsbG8="

assert decode_b64(b"SGVsbG8=") == "Hello"

ارزیابی شباهت دو رشته

برای ارزیابی شباهت میان دو رشته، به غیر از به‌کارگیری مسافت لون‌اشتاین در nltk.edit_distance می‌توان از کتابخانه difflib نیز استفاده کرد. مقدار 1.0 بیان‌گر مقدار دقیق رشته است.

import difflib

 

 

def similarity(left: str = "", right: str = "") -> float:

 

    seq = difflib.SequenceMatcher(None, left, right)

    return seq.ratio()

 

 

assert similarity("I like bananas", "I like bananarama") >= 0.80

assert similarity("I like bananas", "The quick brown fox") <= 0.25

حذف یک کاراکتر از یک شاخص خاص

رشته‌ها دنباله‌ای از کاراکترها هستند و به همین دلیل می‌توان از عملیات slice روی آن‌ها استفاده کرد. قطعه کد زیر این موضوع را نشان می‌دهد.

def remove_by_index(original: str = "", index: int = -1) -> tuple:

    if len(original) >= index and index >= 0:

        return (original[:index] + original[index + 1:], original[index])

    else:

        return (original, "")

 

 

assert remove_by_index("0123456789", 5) == ("012346789", "5")

view rawstrings_22_remove_at_index.py hosted with ❤ by GitHub

تبدیل CSV به یک فهرست و برعکس

مقادی جدا شده با کاما (CSV) به شکل گسترده‌ای استفاده می‌شوند، زیرا اکسل آن‌ها را به شکل کارآمدی مدیریت می‌کند و راه‌حلی عموملی برای حل مسائل داده‌ای به شمار می‌روند. در کد زیر یک خط تکی CSV را دریافت می‌کنیم و آ‌ن‌را به یک فهرست از مقادیل تبدیل می‌کنیم.

def from_csv_line(line: str = "") -> list:

 

    return line.split(",")

 

 

assert from_csv_line("a,b,c") == ["a", "b", "c"]

خط 3 در قطعه کد فوق یک فهرست تولید می‌کند و خط ورودی را هر بار که از یک جداکننده کاما استفاده شده می‌شکند. اکنون برعکس این روند را تکرار می‌کنیم و یک فهرست را به خط CSV تبدیل می‌کنیم.

def from_list(line: list = []) -> str:

 

    ret = ", ".join(e for e in line)

    return ret

 

 

assert from_list(["a", "b", "c"]) == "a, b, c"

assert from_list(["one", "two", "three"]) == "one, two, three"

اتصال یک در میان کاراکترهای دو رشته

با استفاده از متد zip_longest از ماژول itertolls می‌توان دو رشته با طول‌های غیر هم اندازه را به صورت کاراکترهای یک در میان از هر یک از رشته‌ها به یکدیگر متصل کنیم. راه‌حل فوق در خروجی یک خلاصه فهرست (list comprehension) ارائه می‌شود که رشته I+j را در یکدیگر ادغام می‌کند.

import itertools

 

 

def interleave(left: str = "", right: str = "") -> str:

 

    return "".join(

        [i + j for i, j in itertools.zip_longest(left, right, fillvalue="")])

 

 

assert interleave("ABCD", "01") == "A0B1CD"

حذف کاراکترهای ناخواسته یک رشته

برای انجام این‌کار باید از تابع replace استفاده کنیم. دقت کنید که امکان تغییر مقدار یک رشته به شکل آنی وجود ندارد، زیرا رشتهرها تغییرناپذیر هستند.

def remove_unwanted(original: str = "",

                    unwanted: str = "",

                    replacement: str = "") -> str:

                    

    return original.replace(unwanted, replacement)

 

 

assert remove_unwanted(original="M'The Real String'",

                       unwanted="M") == "'The Real String'"

پیدا کردن شاخص موقعیت یک کاراکتر در رشته

در راه‌حل فوق از یک خلاصه فهرست به همراه یک فیلتر با استفاده از دستور if استفاده می‌کنیم.

def find_char_locations(original: str = "", character: str = "") -> list:

 

    return [index for index, char in enumerate(original) if char == character]

assert find_char_locations("The jolly green giant.", "e") == [2, 12, 13]

ترجمه رشته به کاراکترهای جایگزین

با استفاده از توابع maketrans و translate می‌توان یک رشته را به حالت بهره‌گیری از کاراکترهای جایگزین تبدیل کرد.

def to_leetspeak(normal_speak:str="") -> str:

 

    leet_mapping = str.maketrans("iseoau", "1530^Ü")

    return normal_speak.translate(leet_mapping).title().swapcase()

 

assert to_leetspeak("the quick brown fox jumped over the lazy dogs") == \

    "tH3 qÜ1cK bR0wN f0x jÜMP3d 0v3r tH3 l^zY d0g5"

ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را می‌توانید از کتابخانه‌های عمومی سراسر کشور و نیز از دکه‌های روزنامه‌فروشی تهیه نمائید.

ثبت اشتراک نسخه کاغذی ماهنامه شبکه     
ثبت اشتراک نسخه آنلاین

 

کتاب الکترونیک +Network راهنمای شبکه‌ها

  • برای دانلود تنها کتاب کامل ترجمه فارسی +Network  اینجا  کلیک کنید.

کتاب الکترونیک دوره مقدماتی آموزش پایتون

  • اگر قصد یادگیری برنامه‌نویسی را دارید ولی هیچ پیش‌زمینه‌ای ندارید اینجا کلیک کنید.

ایسوس

نظر شما چیست؟