Thoát regex ký tự đặc biệt trong chuỗi Python


126

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\" :\\.


2
Bạn nghĩ gì về một nhân vật đặc biệt?
pafcu

1
Hoàn toàn phụ thuộc vào bối cảnh của bạn. Thông thường những ký tự đó là hoàn toàn tốt khi bạn có chúng trong một chuỗi.
chọc

Câu trả lời:


196

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.


1
Bạn có thể sử dụng mô-đun regex thay vì re. Một ví dụ sẽ là regex.escape(pattern,string,special_only=True
Lokinou

17

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 ý:

  • Trong mẫu tìm kiếm , bao gồm \(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 đó .
  • Đặt dấu ngoặc đơn xung quanh mẫu tìm kiếm , ví dụ ([\"]), để 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.)
  • Phía rtrướ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.
  • Trong thay mô hình, bạn cần phải thoát khỏi \để 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 như một chuỗi đơn giản, bạn cần '\\\\\\1'- và không ai muốn điều đó.

9

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" :\\'

3
Điều đó không hoạt động nếu chuỗi là unicode, bởi vì bạn sẽ có u và nên chạyrepr(x)[2:-1]
Antoine Pelisse

Trong python3.4, trong đó tất cả các chuỗi là unicode, điều này dường như không hoạt động gì cả, thật không may. Thay vào đó, print(repr("I'm stuck")[1:-1])in I'm stuck.
dantiston

3

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\" :\\

1

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\" :\

3
Nếu dấu gạch chéo ngược là một trong những dấu gạch charactersđầu tiên thì tốt hơn hết!
steveha

0

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.")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.