Python มีฟังก์ชันที่ฉันสามารถใช้เพื่อหลีกเลี่ยงอักขระพิเศษในนิพจน์ทั่วไปได้หรือไม่
ยกตัวอย่างเช่นควรจะเป็นI'm "stuck" :\
I\'m \"stuck\" :\\
Python มีฟังก์ชันที่ฉันสามารถใช้เพื่อหลีกเลี่ยงอักขระพิเศษในนิพจน์ทั่วไปได้หรือไม่
ยกตัวอย่างเช่นควรจะเป็นI'm "stuck" :\
I\'m \"stuck\" :\\
คำตอบ:
ใช้ 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
regex.escape(pattern,string,special_only=True
ฉันแปลกใจที่ไม่มีใครพูดถึงโดยใช้นิพจน์ทั่วไปผ่าน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'
- และไม่มีใครต้องการที่ใช้ 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" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
I'm stuck
ดังที่ได้กล่าวไว้ข้างต้นคำตอบขึ้นอยู่กับกรณีของคุณ หากคุณต้องการหลีกเลี่ยงสตริงสำหรับนิพจน์ทั่วไปคุณควรใช้ 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\" :\\
มันไม่ยาก:
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\" :\
characters
นั้นดีกว่าเป็นคนแรก!
หากคุณต้องการแทนที่อักขระบางตัวเท่านั้นคุณสามารถใช้สิ่งนี้:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")