تخطَّ إلى المحتوى
NerdLevelTech
تطوير الواجهة الخلفية

إزالة الحرف الأول والأخير: Python مقابل JavaScript

تقطيع Python مقابل slice/substring في JavaScript: إزالة الحرف الأول والأخير بأمان، بما في ذلك السلاسل النصية الفارغة وحالات Unicode الاستثنائية.

Nerd Level Techنُشر في تم التحديث ٨ دقائق للقراءةEnglish
صورة غلاف: إزالة الحرف الأول والأخير: Python مقابل JavaScript

أعيد إنشاؤه: ٢٧ مارس ٢٠٢٦ · آخر تحقق: ٣ نوفمبر ٢٠٢٦.

ملخص

Python: استخدم تقطيع النصوص text[1:-1] (الأبسط) أو text[1:len(text)-1] (الصريح). JavaScript: استخدم .slice(1, -1) (حديث وموصى به) أو .substring(1, length - 1) (طريقة API قديمة، لا تدعم الفهارس السالبة). كلاهما يتعامل مع النصوص الفارغة أو التي تحتوي على حرف واحد بشكل متماثل — حيث يعيدان نصاً فارغاً بأمان.

تعد عملية إزالة الحرف الأول والأخير عملية شائعة في معالجة النصوص عند تحليل البيانات (مثل إزالة علامات الاقتباس أو الأقواس)، وتقليم البيانات (إزالة المحددات)، ومعالجة النصوص بشكل عام. ورغم بساطتها، إلا أن الصيغة تختلف بين اللغات، كما أن التعامل مع الحالات الاستثنائية أمر بالغ الأهمية. يغطي هذا المرجع جميع الطرق مع أمثلة عملية.

طرق Python

python
text = "Hello"
result = text[1:-1]
print(result)  # "ell"

# More examples:
text = "Programming"
result = text[1:-1]
print(result)  # "rogrammin"

# Remove quotes
text = '"Hello, World!"'
result = text[1:-1]
print(result)  # 'Hello, World!'

# Remove brackets
text = "[1, 2, 3]"
result = text[1:-1]
print(result)  # "1, 2, 3"

لماذا تعمل [1:-1]:

  • [1:] = من الفهرس ١ حتى النهاية
  • [:-1] = من البداية حتى الفهرس -1 (الحرف الأخير، مستثنى)
  • [1:-1] = من الفهرس ١ حتى الفهرس -1 (غير شامل)، مما يزيل الأول والأخير

المميزات:

  • متوافقة مع أسلوب Python (idiomatic)
  • موجزة
  • سريعة (عملية أصلية في اللغة)

العيوب:

  • أقل صراحة (قد تسبب ارتباكاً للمبتدئين)

الطريقة ٢: التقطيع [1:len(text)-1] (الصريحة)

python
text = "Hello"
result = text[1:len(text)-1]
print(result)  # "ell"

# Equivalent to [1:-1], but more verbose

المميزات:

  • توضح صراحة "من ١ إلى الطول - ١"
  • أسهل في الفهم للمبتدئين

العيوب:

  • تتطلب كتابة أكثر
  • أبطأ (بشكل طفيف — بسبب استدعاء len())
  • ليست الطريقة الشائعة في Python

الحالات الاستثنائية: Python

النص الفارغ

python
text = ""
result = text[1:-1]
print(result)  # "" (returns empty string, doesn't error)

حرف واحد

python
text = "A"
result = text[1:-1]
print(result)  # "" (removes the only character)

حرفان

python
text = "AB"
result = text[1:-1]
print(result)  # "" (removes both)

ثلاثة أحرف (الحد الأدنى لنتيجة غير فارغة)

python
text = "ABC"
result = text[1:-1]
print(result)  # "B" (keeps middle character)

سلوك آمن ومتوقع: تقطيع النصوص في Python لا يسبب أخطاء أبداً عند استخدام فهارس خارج النطاق، بل يعيد ما هو متاح فقط.

طرق JavaScript

javascript
const text = "Hello";
const result = text.slice(1, -1);
console.log(result);  // "ell"

// More examples:
console.log("Programming".slice(1, -1));  // "rogrammin"
console.log('"Hello, World!"'.slice(1, -1));  // "Hello, World!"
console.log("[1, 2, 3]".slice(1, -1));  // "1, 2, 3"

لماذا تعمل .slice(1, -1):

  • المعامل الأول: فهرس البداية (١)
  • المعامل الثاني: فهرس النهاية (غير شامل، -1 = الحرف الأخير)
  • الفهارس السالبة يتم حسابها من النهاية

المميزات:

  • تعمل في جميع المتصفحات الحديثة
  • آمنة في الحالات الاستثنائية
  • سهلة القراءة

العيوب:

  • لا توجد عيوب تذكر

الطريقة ٢: substring(١, length - ١) (بديل قديم)

javascript
const text = "Hello";
const result = text.substring(1, text.length - 1);
console.log(result);  // "ell"

الاختلافات عن .slice():

  • substring() لا تتعامل مع الفهارس السالبة
  • يجب استخدام .length - 1 بشكل صريح
  • طريقة API أقدم قليلاً

متى تستخدمها: استخدم .slice() بدلاً منها؛ فهي أبسط ومدعومة على نطاق أوسع.

الطريقة ٣: substring() مع تبديل المعاملات (مخادعة)

javascript
const text = "Hello";

// substring() auto-swaps if start > end, making this work:
const result = text.substring(text.length - 1, 1);
console.log(result);  // "ell" (but not recommended, confusing)

غير موصى بها — تعتمد على السلوك الغريب لـ substring().

الحالات الاستثنائية: JavaScript

النص الفارغ

javascript
const text = "";
console.log(text.slice(1, -1));  // "" (safe)

حرف واحد

javascript
const text = "A";
console.log(text.slice(1, -1));  // "" (removes it)

حرفان

javascript
const text = "AB";
console.log(text.slice(1, -1));  // "" (removes both)

ثلاثة أحرف

javascript
const text = "ABC";
console.log(text.slice(1, -1));  // "B" (keeps middle)

مقارنة جنباً إلى جنب

المهمةPythonJavaScript
أساسيtext[1:-1]text.slice(1, -1)
مفصلtext[1:len(text)-1]text.substring(1, text.length - 1)
سلسلة فارغةتعيد ""تعيد ""
حرف واحدتعيد ""تعيد ""
سلوك آمننعمنعم

حالات استخدام عملية

حالة الاستخدام ١: إزالة علامات الاقتباس من السلاسل الشبيهة بـ JSON

python
# Python
json_string = '{"name": "Alice", "age": 30}'
# Remove outer quotes from a value
value = '"Alice"'
clean = value[1:-1]
print(clean)  # Alice
javascript
// JavaScript
const jsonString = '{"name": "Alice", "age": 30}';
const value = '"Alice"';
const clean = value.slice(1, -1);
console.log(clean);  // Alice

حالة الاستخدام ٢: إزالة تدوين الأقواس

python
# Python
bracketed = "[192.168.1.1]"
ip = bracketed[1:-1]
print(ip)  # 192.168.1.1

# Remove angle brackets
tagged = "<html>"
content = tagged[1:-1]
print(content)  # html
javascript
// JavaScript
const bracketed = "[192.168.1.1]";
const ip = bracketed.slice(1, -1);
console.log(ip);  // 192.168.1.1

const tagged = "<html>";
const content = tagged.slice(1, -1);
console.log(content);  // html

حالة الاستخدام ٣: تخطي السطور الأولى والأخيرة (متعدد السطور)

python
# Python
code = """def hello():
    print('Hi')
    return True"""

lines = code.split('\n')
# Keep middle lines only
middle_lines = lines[1:-1]
print('\n'.join(middle_lines))  # "    print('Hi')"
javascript
// JavaScript
const code = `def hello():
    print('Hi')
    return True`;

const lines = code.split('\n');
const middleLines = lines.slice(1, -1);
console.log(middleLines.join('\n'));  // "    print('Hi')"

حالة الاستخدام ٤: إزالة المحددات (المفصولة بـ Pipe)

python
# Python
pipe_delimited = "|item1|item2|item3|"
items = pipe_delimited[1:-1].split('|')
print(items)  # ['item1', 'item2', 'item3']
javascript
// JavaScript
const pipeDelimited = "|item1|item2|item3|";
const items = pipeDelimited.slice(1, -1).split('|');
console.log(items);  // ['item1', 'item2', 'item3']

متقدم: إزالة عدة أحرف من كل طرف

Python: إزالة أول N وآخر M من الأحرف

python
def remove_ends(text: str, start: int = 1, end: int = 1) -> str:
    """Remove start characters from beginning, end from end"""
    return text[start:-end] if end > 0 else text[start:]

print(remove_ends("Hello, World!", 1, 1))  # "ello, World"
print(remove_ends("Hello, World!", 2, 2))  # "llo, Worl"
print(remove_ends("Hello, World!", 1, 0))  # "ello, World!"

JavaScript: إزالة أول N وآخر M من الأحرف

javascript
function removeEnds(text, start = 1, end = 1) {
  if (end === 0) {
    return text.slice(start);
  }
  return text.slice(start, -end);
}

console.log(removeEnds("Hello, World!", 1, 1));  // "ello, World"
console.log(removeEnds("Hello, World!", 2, 2));  // "llo, Worl"
console.log(removeEnds("Hello, World!", 1, 0));  // "ello, World!"

أساليب آمنة من حيث النوع (TypeScript)

typescript
function removeEnds(text: string, start: number = 1, end: number = 1): string {
  if (text.length < start + end) {
    return "";
  }
  return text.slice(start, text.length - end);
}

const result: string = removeEnds("Hello");
console.log(result);  // "ell"

مقارنة الأداء

يتم تنفيذ كل من تقطيع Python و JavaScript .slice() بلغة C/C++، لذا فإن الأداء متطابق للأغراض العملية:

python
# Python timing — run this yourself to get numbers for your machine
import timeit

text = "Hello, World!"
print(timeit.timeit(lambda: text[1:-1], number=1_000_000))
# Slicing is implemented in C; on modern hardware this completes
# in well under a second for a million iterations on a short string.
javascript
// JavaScript timing (1 million iterations)
const text = "Hello, World!";
console.time("slice");
for (let i = 0; i < 1_000_000; i++) {
  text.slice(1, -1);
}
console.timeEnd("slice");
// Performance is extremely fast in modern engines

الحكم النهائي: استخدم الطريقة الاصطلاحية للغتك. كلاهما سريع بما يكفي لأي حالة استخدام في العالم الحقيقي.

الأخطاء الشائعة

Python: نسيان سلوك الفهرس السالب

python
text = "Hello"

# WRONG: Using -1 as end, forgetting it means "up to last char"
result = text[1:-1]  # "ell" (correct by accident)

# WRONG: Thinking -1 = "one character from end"
result = text[:-1]  # "Hell" (removes last char, not what you intended)

JavaScript: عدم فهم الوسيط الثاني لـ .slice()

javascript
const text = "Hello";

// WRONG: Thinking 4 means "4 characters from end"
const result = text.slice(1, 4);  // "ell" (happens to work here)

// WRONG: Using positive index for end when wanting last char
const result2 = text.slice(1, text.length);  // "ello" (keeps last char)

// RIGHT: Use negative index
const result3 = text.slice(1, -1);  // "ell"

البدائل ومتى تستخدمها

عندما تحتاج إلى إزالة مشروطة

python
# Only remove if string long enough
text = "Hi"
result = text[1:-1] if len(text) > 2 else text
print(result)  # "Hi"

text = "Hello"
result = text[1:-1] if len(text) > 2 else text
print(result)  # "ell"
javascript
const text = "Hi";
const result = text.length > 2 ? text.slice(1, -1) : text;
console.log(result);  // "Hi"

عندما تحتاج إلى سلوك مختلف في الحالات الحدية

python
def safe_remove_ends(text: str) -> str:
    """Remove first/last only if safe"""
    if len(text) <= 2:
        return ""  # Or return text, depends on use case
    return text[1:-1]

print(safe_remove_ends("A"))  # ""
print(safe_remove_ends("AB"))  # ""
print(safe_remove_ends("ABC"))  # "B"

الخلاصة

يعتبر كل من [1:-1] في Python و .slice(1, -1) في JavaScript أساليب اصطلاحية وآمنة وسريعة. فهي تتعامل مع الحالات الحدية بسلاسة (تعيد سلاسل فارغة بدلاً من إظهار خطأ). استخدمها بثقة. الفائدة الرئيسية: الفهارس السالبة في كلتا اللغتين قوية وبديهية بمجرد أن تستوعب أن -1 تعني "العنصر الأخير".

ابقَ على مسار النيرد

رسالة واحدة كلّ أسبوع: عدد الخميس يضمّ شرحًا لمنظومة واحدة، وثلاث وظائف عن بُعد، وتمرينًا واحدًا، وخلاصة بالعربية.

بدون إزعاج. إلغاء الاشتراك في أي وقت.