بيثون التعبيرات العادية لتنفيذ سلسلة unescaping

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

  •  08-06-2019
  •  | 
  •  

سؤال

أنا أحاول تنفيذ سلسلة unescaping مع بيثون regex و backreferences, و يبدو أنها لا تريد أن تعمل بشكل جيد جدا.أنا متأكد انه شيء أفعله خطأ ولكن أنا لا يمكن معرفة ما...

>>> import re
>>> mystring = r"This is \n a test \r"
>>> p = re.compile( "\\\\(\\S)" )
>>> p.sub( "\\1", mystring )
'This is n a test r'
>>> p.sub( "\\\\\\1", mystring )
'This is \\n a test \\r'
>>> p.sub( "\\\\1", mystring )
'This is \\1 a test \\1'

أود أن محل \\[شار] مع \[شار] ، ولكن backreferences في بيثون لا تظهر إلى اتباع نفس القواعد يفعلون في كل تنفيذ كنت تستخدم أي وقت مضى.شخص ما يمكن أن يلقي بعض الضوء ؟

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

المحلول

أليس هذا ما اندرس' المثال الثاني ؟

في 2.5 هناك أيضا string-escape ترميز يمكنك تطبيق:

>>> mystring = r"This is \n a test \r"
>>> mystring.decode('string-escape')
'This is \n a test \r'
>>> print mystring.decode('string-escape')
This is 
 a test 
>>> 

نصائح أخرى

أعتقد أنك قد غاب r أو أخطأت في عد الخطوط المائلة العكسية...

"\\n" == r"\n"

>>> import re
>>> mystring = r"This is \\n a test \\r"
>>> p = re.compile( r"[\\][\\](.)" )
>>> print p.sub( r"\\\1", mystring )
This is \n a test \r
>>>

لم يفهم ما طلب.

وأظن أكثر شيوعا طلب هو هذا:

>>> d = {'n':'\n', 'r':'\r', 'f':'\f'}
>>> p = re.compile(r"[\\]([nrfv])")
>>> print p.sub(lambda mo: d[mo.group(1)], mystring)
This is \
 a test \
>>>

على الطالب المهتم أن يقرأ أيضا كين تومسون تأملات في الثقة الثقة", حيث بطلنا يستخدم مثال مشابه لشرح مخاطر الثقة المجمعين لم ألبس الحذاء من رمز الجهاز نفسك.

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

آخر مثال توضيحي:

>>> mystring = r"This is \n ridiculous"
>>> print mystring
This is \n ridiculous
>>> p = re.compile( r"\\(\S)" )
>>> print p.sub( 'bloody', mystring )
This is bloody ridiculous
>>> print p.sub( r'\1', mystring )
This is n ridiculous
>>> print p.sub( r'\\1', mystring )
This is \1 ridiculous
>>> print p.sub( r'\\\1', mystring )
This is \n ridiculous

ما أود أن الطباعة

This is 
ridiculous

يجري خداع بايثون تمثيل نتيجة سلسلة.الثعبان التعبير:

'This is \\n a test \\r'

تمثل السلسلة

This is \n a test \r

وهو اعتقد ما تريد.حاول إضافة 'طباعة' أمام كل من ع الخاص.الفرعي() يدعو إلى طباعة سلسلة الفعلي عاد بدلا من الثعبان تمثيل السلسلة.

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r

العلامة ؛ له المثال الثاني يتطلب كل هرب حرف ألقيت في مجموعة في البداية ، الذي يولد KeyError إذا كان تسلسل الهروب يحدث في الصفيف.وسوف يموت في أي شيء سوى ثلاثة أحرف المقدمة (إعطاء \v محاولة) ، تعداد كل تسلسل الهروب في كل مرة تريد unescape سلسلة (أو حفظ مجموعة عالمية) هو حقا سيئة الحل.مماثلة PHP ، استخدام preg_replace_callback() مع امدا بدلا من preg_replace(), الذي هو تماما لا لزوم لها في هذه الحالة.

أنا آسف إذا أنا نزوله ديك عن ذلك, أنا محبط تماما مع بيثون.هذا ويدعم كل تعبير عادي محرك لقد استخدمت من أي وقت مضى, وأنا لا يمكن أن نفهم لماذا هذا لن يجدي.

شكرا لك على الرد;على string.decode('string-escape') وظيفة هو بالضبط ما كنت أبحث عنه في البداية.إذا كان شخص ما لديه الحل العام إلى regex backreference مشكلة لا تتردد بعد ذلك سوف تقبل أن الجواب كذلك.

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