Какой правильный синтаксис регулярных выражений оставить + и.при удалении несовпадающих символов из строки? - PullRequest
0 голосов
/ 20 декабря 2018

Я ищу регулярное выражение для удаления не-ASCII символов, но сохраняю любые ['_','-','+', '.'] из строки.

Следующее работает для всех, кроме ['+', '.']

import re
text = 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-áéíóú'
re.sub(r'[^A-Za-z0-9_-]+','',text)

который возвращает 'ValidCharactersForPassword123_-AndRemoveNonAscii-', где ['+', '.'] было удалено, что является правильным.

Я ищу, чтобы получить результат, подобный 'ValidCharactersForPassword123_-+.AndRemoveNonAscii-

Я пытался избежать+ и.но то, что я пробовал, терпит неудачу.

re.sub(r'[^A-Za-z0-9_-\+]+','',text)
re.sub(r'[^A-Za-z0-9_-\\+]+','',text)
re.sub(r'[^A-Za-z0-9_-\\\+]+','',text)

возвращает такие ошибки, как

error: bad character range _-\\ at position 11

Какой правильный синтаксис сохранить + и.при удалении несовпадающих символов из строки?

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Вы можете сделать это следующим образом

Когда вы используете - в end или start класса символов, вам не нужно избегать его, иначе вам нужноизбежать его

[^A-Za-z0-9_+.-]+

Код

import re
text = 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-áéíóú'
re.sub(r'[^A-Za-z0-9_+.-]+','',text)

Демо

0 голосов
/ 20 декабря 2018

Просто убедитесь, что вы добавили в свой отрицательный класс все символы, которые вы хотите убрать из удаления.Обратите внимание, что единственный интересующий вас символ, который нужно экранировать внутри класса, это -.Но, как вы уже делаете, мы можем просто переместить его в конец класса, чтобы избежать необходимости избегать его.

# -*- coding: utf-8 -*-

import re
text = 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-áéíóú'
output = re.sub(r'[^A-Za-z0-9_+.-]+','',text)
print(output)

ValidCharactersForPassword123._-+.AndRemoveNonAscii-
0 голосов
/ 20 декабря 2018

Только не ставьте экранированные + или . (или любые другие повторные символы) сразу после -, так как это может вызвать проблемы:

In [3]: import re
   ...: text = 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-áéíóú'
   ...: re.sub(r'[^A-Za-z0-9\+\._-]+','',text)
Out[3]: 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-'

Это потому, что ваш исходный код интерпретировал "[...._-\+]" как любой символ в диапазоне от _ до +.

Вы также можете экранировать - как в:

In [1]: import re
   ...: text = 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-áéíóú'
   ...: re.sub(r'[^A-Za-z0-9\._\-\+]+','',text)
Out[1]: 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...