Чи має Python функцію, яку я можу використовувати, щоб уникнути спеціальних символів у регулярному виразі?
Наприклад, I'm "stuck" :\
повинні стати I\'m \"stuck\" :\\
.
Чи має Python функцію, яку я можу використовувати, щоб уникнути спеціальних символів у регулярному виразі?
Наприклад, I'm "stuck" :\
повинні стати I\'m \"stuck\" :\\
.
Відповіді:
Використовуйте 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()
було змінено, щоб уникнути лише символів, які мають значення для операцій регулярного виведення.
regex.escape(pattern,string,special_only=True
Я здивований, що ніхто не згадував використання регулярних виразів через 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'
- і цього ніхто не хоче.Використовуйте 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" :\\'
repr(x)[2:-1]
print(repr("I'm stuck")[1:-1])
друкує I'm stuck
.
Як було сказано вище, відповідь залежить від вашого випадку. Якщо ви хочете вийти з рядка для регулярного виразу, тоді вам слід скористатися 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\" :\\
Це не так складно:
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
них, краще бути першим!
Якщо ви хочете замінити лише деякі символи, ви можете скористатися цим:
import re
print re.sub(r'([\.\\\+\*\?\[\^\]\$\(\)\{\}\!\<\>\|\:\-])', r'\\\1', "example string.")