หลีกเลี่ยงอักขระพิเศษ regex ในสตริง Python


126

Python มีฟังก์ชันที่ฉันสามารถใช้เพื่อหลีกเลี่ยงอักขระพิเศษในนิพจน์ทั่วไปได้หรือไม่

ยกตัวอย่างเช่นควรจะเป็นI'm "stuck" :\I\'m \"stuck\" :\\


2
อะไรที่คุณคิดว่าเป็นตัวละครพิเศษ?
pafcu

1
ขึ้นอยู่กับบริบทของคุณโดยสิ้นเชิง โดยปกติแล้วอักขระเหล่านั้นจะใช้ได้ดีโดยสิ้นเชิงเมื่อคุณมีอยู่ในสตริง
โผล่

อาจซ้ำกันได้ของEscaping regex string ใน Python
Jukka Suomela

คำตอบ:


197

ใช้ re.escape

>>> import re
>>> re.escape(r'\ a.*$')
'\\\\\\ a\\.\\*\\$'
>>> print(re.escape(r'\ a.*$'))
\\\ a\.\*\$
>>> re.escape('www.stackoverflow.com')
'www\\.stackoverflow\\.com'
>>> print(re.escape('www.stackoverflow.com'))
www\.stackoverflow\.com

ทำซ้ำที่นี่:

re.escape (สตริง)

ส่งคืนสตริงที่มีแบ็กสแลชที่ไม่ใช่ตัวอักษรและตัวเลขทั้งหมด สิ่งนี้มีประโยชน์หากคุณต้องการจับคู่สตริงตามตัวอักษรที่กำหนดเองซึ่งอาจมีอักขระเมตาของนิพจน์ทั่วไปอยู่ในนั้น

ในขณะที่ Python 3.7 re.escape()ถูกเปลี่ยนให้ใช้ Escape เฉพาะอักขระที่มีความหมายต่อการดำเนินการ regex


1
คุณอาจใช้โมดูล regex แทน regex ตัวอย่างเช่น regex.escape(pattern,string,special_only=True
Lokinou

17

ฉันแปลกใจที่ไม่มีใครพูดถึงโดยใช้นิพจน์ทั่วไปผ่านre.sub():

import re
print re.sub(r'([\"])',    r'\\\1', 'it\'s "this"')  # it's \"this\"
print re.sub(r"([\'])",    r'\\\1', 'it\'s "this"')  # it\'s "this"
print re.sub(r'([\" \'])', r'\\\1', 'it\'s "this"')  # it\'s\ \"this\"

สิ่งสำคัญที่ควรทราบ:

  • ในรูปแบบการค้นหาให้รวม\และอักขระที่คุณกำลังมองหา คุณจะต้องใช้\ในการหลบหนีตัวอักษรของคุณดังนั้นคุณจึงจำเป็นที่จะหลบหนี ที่เช่นกัน
  • ใส่วงเล็บรอบรูปแบบการค้นหาเช่น([\"])เพื่อให้ รูปแบบการแทนที่สามารถใช้อักขระที่พบเมื่อเพิ่ม\ไว้ข้างหน้า (นั่นคือสิ่งที่ \1ทำ: ใช้ค่าของกลุ่มวงเล็บแรก)
  • rในด้านหน้าของr'([\"])'วิธีการจะเป็นสตริงดิบ สตริงดิบใช้กฎที่แตกต่างกันสำหรับการหลีกเลี่ยงแบ็กสแลช จะเขียน([\"])เป็นสตริงธรรมดาที่คุณจะต้องเป็นสองเท่า backslashes '([\\"])'ทั้งหมดและการเขียน สตริงดิบจะเป็นมิตรกว่าเมื่อคุณเขียนนิพจน์ทั่วไป
  • ในการเปลี่ยนตัวรูปแบบที่คุณต้องการที่จะหลบหนี\ความแตกต่างจากเครื่องหมายที่นำหน้ากลุ่มทดแทนเช่นเพราะฉะนั้น\1 r'\\\1'ในการเขียน ที่เป็นสตริงธรรมดาที่คุณจะต้อง'\\\\\\1'- และไม่มีใครต้องการที่

9

ใช้ repr () [1: -1] ในกรณีนี้ไม่จำเป็นต้องใช้เครื่องหมายอัญประกาศคู่ ส่วน [-1: 1] คือการลบเครื่องหมายคำพูดเดียวจากจุดเริ่มต้นและจุดสิ้นสุด

>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\

หรือบางทีคุณแค่ต้องการหลีกเลี่ยงวลีที่จะวางลงในโปรแกรมของคุณ? หากเป็นเช่นนั้นให้ทำดังนี้

>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'

3
ไม่ได้ผลถ้าสตริงเป็น Unicode เพราะคุณจะมี u และควรรันrepr(x)[2:-1]
Antoine Pelisse

ใน python3.4 ซึ่งสตริงทั้งหมดเป็น Unicode ดูเหมือนว่าจะใช้งานไม่ได้เลย แทนการพิมพ์print(repr("I'm stuck")[1:-1]) I'm stuck
dantiston

3

ดังที่ได้กล่าวไว้ข้างต้นคำตอบขึ้นอยู่กับกรณีของคุณ หากคุณต้องการหลีกเลี่ยงสตริงสำหรับนิพจน์ทั่วไปคุณควรใช้ re.escape () แต่ถ้าคุณต้องการหลีกเลี่ยงชุดอักขระเฉพาะให้ใช้ฟังก์ชันแลมบ์ดานี้:

>>> escape = lambda s, escapechar, specialchars: "".join(escapechar + c if c in specialchars or c == escapechar else c for c in s)
>>> s = raw_input()
I'm "stuck" :\
>>> print s
I'm "stuck" :\
>>> print escape(s, "\\", ['"'])
I'm \"stuck\" :\\

1

มันไม่ยาก:

def escapeSpecialCharacters ( text, characters ):
    for character in characters:
        text = text.replace( character, '\\' + character )
    return text

>>> escapeSpecialCharacters( 'I\'m "stuck" :\\', '\'"' )
'I\\\'m \\"stuck\\" :\\'
>>> print( _ )
I\'m \"stuck\" :\

3
ถ้าแบ็กสแลชเป็นหนึ่งในcharactersนั้นดีกว่าเป็นคนแรก!
steveha

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.