Уникнути спеціальних символів регулярного вираження в рядку Python


126

Чи має Python функцію, яку я можу використовувати, щоб уникнути спеціальних символів у регулярному виразі?

Наприклад, I'm "stuck" :\повинні стати I\'m \"stuck\" :\\.


2
Що ви вважаєте особливим персонажем?
pafcu

1
Повністю залежить від вашого контексту. Зазвичай ці символи є цілком чудовими, коли ви маєте їх у рядку.
ткнути

можливий дублікат Escaping regex string в Python
Jukka Suomela

Відповіді:


197

Використовуйте 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()було змінено, щоб уникнути лише символів, які мають значення для операцій регулярного виведення.


1
Ви можете використовувати модуль регулярного вираження замість повторного. Прикладом може бути regex.escape(pattern,string,special_only=True
Локіну

17

Я здивований, що ніхто не згадував використання регулярних виразів через 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'([\"])'засобами цього сировини рядки . Сирі рядки використовують різні правила для уникнення зворотних нахилів. Щоб писати ([\"])як звичайний рядок, вам потрібно буде подвоїти всі косої риски і написати '([\\"])'. Сирі рядки дружніші, коли ви пишете регулярні вирази.
  • У схемі заміщення вам потрібно уникнути, \щоб відрізнити її від зворотної косої риси, яка передує групі заміщення, наприклад \1, отже r'\\\1'. Щоб написати це як звичайний рядок, вам знадобиться '\\\\\\1'- і цього ніхто не хоче.

9

Використовуйте 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" :\\'

3
Це не працює, якщо рядок є unicode, тому що ви будете мати і повинні працюватиrepr(x)[2:-1]
Antoine Pelisse

На жаль, у python3.4, де всі рядки є unicode, це, на жаль, не працює. Натомість print(repr("I'm stuck")[1:-1])друкує I'm stuck.
Дантістон

3

Як було сказано вище, відповідь залежить від вашого випадку. Якщо ви хочете вийти з рядка для регулярного виразу, тоді вам слід скористатися 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\" :\\

1

Це не так складно:

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
Якщо нахил нахилу один із charactersних, краще бути першим!
steveha

0

Якщо ви хочете замінити лише деякі символи, ви можете скористатися цим:

import re

print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.