دستکاری رشتهها کاری است که برنامهنویسان مختلف به شکل گسترده انجام میدهند. بر همین اساس در این مطلب با 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 اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟