Python có chức năng mà tôi có thể sử dụng để thoát các ký tự đặc biệt trong biểu thức chính quy không?
Ví dụ, I'm "stuck" :\
nên trở thành I\'m \"stuck\" :\\
.
Python có chức năng mà tôi có thể sử dụng để thoát các ký tự đặc biệt trong biểu thức chính quy không?
Ví dụ, I'm "stuck" :\
nên trở thành I\'m \"stuck\" :\\
.
Câu trả lời:
Sử dụng 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
Lặp lại ở đây:
re.escape (chuỗi)
Trả về chuỗi với tất cả các chữ số không được viết ngược; điều này rất hữu ích nếu bạn muốn khớp một chuỗi ký tự tùy ý có thể có các siêu ký tự biểu thức chính quy trong đó.
Kể từ Python 3.7 re.escape()
đã được thay đổi để chỉ thoát các ký tự có ý nghĩa đối với các hoạt động regex.
regex.escape(pattern,string,special_only=True
Tôi ngạc nhiên không ai đề cập đến việc sử dụng các biểu thức thông thường qua 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\"
Những điều quan trọng cần lưu ý:
\
(các) nhân vật bạn đang tìm kiếm. Bạn sẽ sử dụng \
để thoát khỏi nhân vật của mình, vì vậy bạn cần phải thoát khỏi
điều đó .([\"])
, để
mẫu thay thế có thể sử dụng ký tự tìm thấy khi nó thêm \
vào trước mẫu. (Đó là những gì
\1
: sử dụng giá trị của nhóm được ngoặc đơn đầu tiên.)r
trước r'([\"])'
có nghĩa là một chuỗi thô . Chuỗi thô sử dụng các quy tắc khác nhau để thoát dấu gạch chéo ngược. Để viết ([\"])
dưới dạng một chuỗi đơn giản, bạn cần phải nhân đôi tất cả các dấu gạch chéo ngược và viết '([\\"])'
. Chuỗi thô thân thiện hơn khi bạn viết biểu thức chính quy.\
để phân biệt nó với một dấu gạch chéo đứng trước một nhóm thay thế, ví dụ \1
, do đó r'\\\1'
. Để viết
nó như một chuỗi đơn giản, bạn cần '\\\\\\1'
- và không ai muốn điều đó.Sử dụng repr () [1: -1]. Trong trường hợp này, dấu ngoặc kép không cần phải thoát. Lát [-1: 1] là loại bỏ trích dẫn đơn từ đầu và cuối.
>>> x = raw_input()
I'm "stuck" :\
>>> print x
I'm "stuck" :\
>>> print repr(x)[1:-1]
I\'m "stuck" :\\
Hoặc có thể bạn chỉ muốn thoát khỏi một cụm từ để dán vào chương trình của bạn? Nếu vậy, hãy làm điều này:
>>> raw_input()
I'm "stuck" :\
'I\'m "stuck" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
in I'm stuck
.
Như đã đề cập ở trên, câu trả lời phụ thuộc vào trường hợp của bạn. Nếu bạn muốn thoát một chuỗi cho một biểu thức thông thường thì bạn nên sử dụng re.escape (). Nhưng nếu bạn muốn thoát khỏi một bộ ký tự cụ thể thì hãy sử dụng hàm lambda này:
>>> 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\" :\\
Nó không khó lắm đâu:
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
đầu tiên thì tốt hơn hết!
Nếu bạn chỉ muốn thay thế một số ký tự, bạn có thể sử dụng:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")