Escape karakter khusus regex dalam string Python


126

Apakah Python memiliki fungsi yang dapat saya gunakan untuk mengosongkan karakter khusus dalam ekspresi reguler?

Misalnya, I'm "stuck" :\harus menjadi I\'m \"stuck\" :\\.


2
Apa yang Anda anggap sebagai karakter khusus?
pafcu

1
Sangat bergantung pada konteks Anda. Biasanya karakter tersebut benar-benar baik-baik saja jika Anda memasukkannya ke dalam string.
aduk

Jawaban:


197

Menggunakan 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

Ulangi di sini:

re.escape (string)

Kembalikan string dengan semua non-alfanumerik dengan garis miring terbalik; ini berguna jika Anda ingin mencocokkan string literal arbitrer yang mungkin memiliki karakter meta ekspresi reguler di dalamnya.

Pada Python 3.7 re.escape()telah diubah untuk menghindari hanya karakter yang berarti untuk operasi regex.


1
Anda dapat menggunakan modul regex sebagai ganti re. Contohnya adalah regex.escape(pattern,string,special_only=True
Lokinou

17

Saya terkejut tidak ada yang menyebutkan menggunakan ekspresi reguler melalui 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\"

Hal penting yang perlu diperhatikan:

  • Dalam pola pencarian , sertakan \serta karakter yang Anda cari. Anda akan menggunakan \untuk melarikan diri karakter Anda, sehingga Anda perlu untuk melarikan diri yang juga.
  • Letakkan tanda kurung di sekitar pola pencarian , misalnya ([\"]), sehingga pola substitusi dapat menggunakan karakter yang ditemukan saat ditambahkan \di depannya. (Itulah \1fungsinya: menggunakan nilai dari grup dalam tanda kurung pertama.)
  • Di rdepan r'([\"])'berarti itu adalah string mentah . String mentah menggunakan aturan berbeda untuk menghindari garis miring terbalik. Untuk menulis ([\"])sebagai string biasa, Anda perlu menggandakan semua garis miring terbalik dan menulis '([\\"])'. String mentah lebih ramah saat Anda menulis ekspresi reguler.
  • Dalam pola substitusi , Anda perlu melepaskan diri \untuk membedakannya dari garis miring terbalik yang mendahului grup substitusi, misalnya \1, karenanya r'\\\1'. Untuk menulis bahwa sebagai string biasa, Anda akan perlu '\\\\\\1'- dan tak seorang pun ingin itu.

9

Gunakan repr () [1: -1]. Dalam kasus ini, tanda kutip ganda tidak perlu di-escape. Potongan [-1: 1] digunakan untuk menghapus kutipan tunggal dari awal dan akhir.

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

Atau mungkin Anda hanya ingin melepaskan frasa untuk ditempelkan ke program Anda? Jika ya, lakukan ini:

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

3
Itu tidak berfungsi jika stringnya adalah unicode, karena Anda akan memiliki u dan harus menjalankanrepr(x)[2:-1]
Antoine Pelisse

Di python3.4, di mana semua string adalah unicode, sayangnya ini tampaknya tidak berfungsi sama sekali. Sebagai gantinya, print(repr("I'm stuck")[1:-1])cetak I'm stuck.
dantiston

3

Seperti yang telah disebutkan di atas, jawabannya tergantung pada kasus Anda. Jika Anda ingin meng-escape string untuk ekspresi reguler maka Anda harus menggunakan re.escape (). Tetapi jika Anda ingin keluar dari sekumpulan karakter tertentu, gunakan fungsi lambda ini:

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

Tidak sesulit itu:

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
Jika garis miring terbalik adalah salah satu dari charactersitu sebaiknya menjadi yang pertama!
steveha

0

Jika Anda hanya ingin mengganti beberapa karakter, Anda dapat menggunakan ini:

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.