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

Wolfy
sumber
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
kemungkinan duplikat string regex Escaping dengan Python
Jukka Suomela

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.

pyfunc
sumber
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.
Tim Ruddick
sumber
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" :\\'
dp_
sumber
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\" :\\
spatar
sumber
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\" :\
menyodok
sumber
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.")
Christoph Roeder
sumber