ماذا تفعل بالضبط "ش" و "ص" سلسلة أعلام القيام به ، وما هي الخام سلسلة حرفية?

StackOverflow https://stackoverflow.com/questions/2081640

سؤال

حين يسأل هذا السؤال, أدركت أني لم أكن أعرف الكثير عن الخام السلاسل.شخص يدعي أنه جانغو المدرب, هذا مقرف.

أنا أعرف ما هو ترميز وأعلم ما u'' وحده لا منذ أن كنت تحصل على ما هو Unicode.

  • ولكن ماذا يفعل r'' تفعل بالضبط ؟ ما نوع string هل النتيجة ؟

  • وفوق كل ما هيك لا ur'' تفعل ؟

  • أخيرا, هل هناك أي طريقة يمكن الاعتماد عليها العودة من سلسلة Unicode بسيط الخام السلسلة ؟

  • آه و بالمناسبة إذا كان النظام الخاص بك محرر النص الخاص بك محارف إلى UTF-8 ، لا u'' تفعل في الواقع أي شيء ؟

هل كانت مفيدة؟

المحلول

ليس هناك حقًا "خام سلسلة"؛ هناك الخام سلسلة حرفية, 'r' قبل اقتباس الافتتاح.

"سلسلة خام حرفية" عبارة \, ، يتم اعتباره يعني "مجرد ضربة خلفية" (باستثناء عندما يأتي قبل اقتباس من شأنه أن ينهي الحرفي)-لا "تسلسل الهروب" لتمثيل العلامات الجديدة ، ومساحات الخلفية ، وتغذية النماذج ، وما إلى ذلك. في الحرفيات العادية ، يجب مضاعفة كل ضربة خلفية لتجنب اعتبارها بداية تسلسل الهروب.

This syntax variant exists mostly because the syntax of regular expression patterns is heavy with backslashes (but never at the end, so the "except" clause above doesn't matter) and it looks a bit better when you avoid doubling up each of them - - هذا كل شئ. It also gained some popularity to express native Windows file paths (with backslashes instead of regular slashes like on other platforms), but that's very rarely needed (since normal slashes mostly work fine on Windows too) and imperfect (due to the "except" clause في الاعلى).

r'...' هي سلسلة بايت (في بيثون 2.*) ur'...' هي سلسلة Unicode (مرة أخرى ، في Python 2.*) ، وأي من الأنواع الثلاثة الأخرى من الاقتباس تنتج أيضًا نفس أنواع السلاسل (لذلك على سبيل المثال r'...', r'''...''', r"...", r"""...""" هي كل سلاسل البايت ، وهلم جرا).

لست متأكدًا مما تقصده بـ "الذهاب الى الخلف" - لا توجد اتجاهات للخلف والأمام في جوهرها ، لأنه لا توجد سلسلة خام يكتب, ، إنه مجرد بناء جملة بديل للتعبير عن كائنات سلسلة طبيعية تمامًا ، بايت أو أحاديًا كما قد تكون.

ونعم ، في بيثون 2.*، u'...' هو بالطبع دائما متميزة عن العادل '...' - الأول عبارة عن سلسلة يونيكود ، والأخير عبارة عن سلسلة بايت. ما هو ترميز الحرفي الذي يمكن التعبير عنه هو قضية متعامدة تمامًا.

على سبيل المثال ، ضع في اعتبارك (Python 2.6):

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

بالطبع يأخذ كائن Unicode مساحة أكبر للذاكرة (فرق صغير جدًا لسلسلة قصيرة جدًا ، من الواضح ؛-).

نصائح أخرى

هناك نوعان من السلسلة في بيثون: التقليدية str اكتب وأحدث unicode يكتب. إذا قمت بكتابة سلسلة حرفية بدون u في المقدمة تحصل على القديم str اكتب التي تخزن أحرف 8 بت ، ومع u في المقدمة تحصل على الأحدث unicode اكتب التي يمكنها تخزين أي حرف Unicode.

ال r لا يغير النوع على الإطلاق ، إنه يغير فقط كيفية تفسير السلسلة الحرفية. بدون ال r, ، يتم التعامل مع التراجعات الخلفية على أنها شخصيات الهروب. مع ال r,

ur هو بالطبع سلسلة Unicode حيث تراجع التراجعات الحرفية ، وليس جزء من رموز الهروب.

يمكنك محاولة تحويل سلسلة Unicode إلى سلسلة قديمة باستخدام str() str

"السلسلة الخام" يعني أنه يتم تخزينه كما يظهر. علي سبيل المثال، '\' ما هو الا التراجع بدلا من الهروب.

تشير بادئة "U" إلى أن القيمة لها نوع unicode عوضا عن str.

حرفية السلسلة الخام ، مع بادئة "R" ، الهروب من أي تسلسل الهروب داخلها ، لذلك len(r"\n") IS 2. لأنهم يهربون من تسلسل الهروب ، لا يمكنك إنهاء سلسلة حرفية مع اندلاء عكسي واحد: هذا ليس تسلسل هروب صالح (على سبيل المثال r"\").

"RAW" ليس جزءًا من النوع ، فهو مجرد طريقة واحدة لتمثيل القيمة. علي سبيل المثال، "\\n" و r"\n" هي قيم متطابقة ، تمامًا مثل 32, 0x20, ، و 0b100000 متطابقة.

يمكن أن يكون لديك Unicode Raw String حرفيًا:

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

مستحسن لتجنب الكود حيث يقوم الترميز بخلاف ASCII بتغيير المعنى:

اسمحوا لي أن أشرح ذلك ببساطة:في بيثون 2, يمكنك تخزين السلسلة في 2 أنواع مختلفة.

أول واحد هو ASCII وهو str اكتب في بيثون ، ويستخدم 1 بايت من الذاكرة.(256 حرفا, تخزين الغالب الحروف الهجائية الانجليزية و رموز بسيطة)

2 نوع هو UNICODE وهو unicode اكتب في بيثون ، ويستخدم 2 بايت من الذاكرة.(65536 حرفا ، لذلك هذه تشمل جميع الشخصيات من جميع اللغات على وجه الأرض)

بشكل افتراضي ، بيثون سوف تفضل str نوع ولكن إذا كنت ترغب في تخزين السلسلة في unicode نوع يمكنك وضع u أمام النص مثل u'text' أو يمكنك القيام بذلك عن طريق استدعاء unicode('text')

لذلك u هو مجرد وسيلة قصيرة إلى استدعاء دالة على الزهر str إلى unicode.هذا هو!

الآن r الجزء وضعه أمام النص أن تخبر الكمبيوتر أن النص هو نص الخام ، مائل لا ينبغي أن يكون الهروب من الحرف. r ' لا إنشاء خط جديد حرف.انها مجرد نص عادي يحتوي على 2 أحرف.

إذا كنت ترغب في تحويل str إلى unicode و أيضا وضع نص الخام نعم ، اور لأن ru رفع خطأ.

الآن الجزء المهم:

لا يمكنك تخزين واحدة مائل باستخدام r, إنه الاستثناء الوحيد.حتى هذا الرمز سوف تنتج خطأ: r'\'

لتخزين خط مائل عكسي (واحد فقط) تحتاج إلى استخدام '\\'

إذا كنت ترغب في تخزين أكثر من 1 حرفا لا يزال بإمكانك استخدام r مثل r'\\' سوف تنتج 2 خطوط مائلة عكسية كما هو متوقع.

أنا لا أعرف السبب r لا يعمل مع أحد مائل التخزين ولكن السبب ليس هو موضح من قبل أي شخص حتى الآن.أتمنى أن الخلل.

ربما يكون هذا واضحًا ، ربما لا ، ولكن يمكنك صنع السلسلة '\' بالاتصال x = chr (92)

x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y   # True
x is y # False

Unicode سلسلة حرفية

حرفية سلسلة Unicode (سلسلة حرفية بادئة بواسطة u) نكون لم يعد يستخدم في بيثون 3. لا تزال صالحة ولكن فقط لأغراض التوافق مع بيثون 2.

سلسلة خام الحرفية

إذا كنت ترغب في إنشاء سلسلة حرفية تتكون من أحرف قابلة للتطبيق بسهولة مثل الحروف أو الأرقام الإنجليزية ، فيمكنك ببساطة كتابتها: 'hello world'. ولكن إذا كنت ترغب في تضمين بعض الشخصيات الغريبة أيضًا ، فسيتعين عليك استخدام بعض الحلول. أحد الحلول تسلسلات الهروب. وبهذه الطريقة ، يمكنك على سبيل المثال تمثيل سطر جديد في السلسلة الخاصة بك ببساطة عن طريق إضافة حرفين يمكن أن يكونوا بسهولة \n إلى سلسلة حرفيك. لذلك عند طباعة 'hello\nworld' سلسلة ، سيتم طباعة الكلمات على خطوط منفصلة. هذا مفيد جدا!

من ناحية أخرى ، هناك بعض المواقف عندما تريد إنشاء سلسلة حرفية تحتوي على تسلسل الهروب ولكنك لا تريد أن تفسرها من قبل Python. تريدهم أن يكونوا الخام. ننظر في هذه الأمثلة:

'New updates are ready in c:\windows\updates\new'
'In this lesson we will learn what the \n escape sequence does.'

في مثل هذه الحالات ، يمكنك فقط بادئة السلسلة الحرفية مع r شخصية مثل هذا: r'hello\nworld' ولن يتم تفسير تسلسل الهروب بواسطة Python. سيتم طباعة السلسلة تمامًا كما قمت بإنشائها.

الحرفية الأولية الخام ليست "خام" تماما؟

يتوقع الكثير من الناس أن تكون الحرفية الأولية الخام خامًا بمعنى ما "يتم تجاهل أي شيء يتم وضعه بين الاقتباسات من قبل Python". هذا ليس صحيحا. لا يزال بيثون يتعرف على جميع تسلسل الهروب ، فهو لا يفسرها - إنه يتركهم دون تغيير بدلاً من ذلك. هذا يعني انه لا يزال يتعين أن تكون حرفية السلسلة الصالحة في الأسلاك الحرفية.

من تعريف معجمي من سلسلة حرفية:

string     ::=  "'" stringitem* "'"
stringitem ::=  stringchar | escapeseq
stringchar ::=  <any source character except "\" or newline or the quote>
escapeseq  ::=  "\" <any source character>

من الواضح أن الأسلاك الحرفية (الخام أم لا) تحتوي على حرف اقتباس عاري: 'hello'world' أو ينتهي مع انتشار خلفي: 'hello world\' غير صالحين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top