我正在寻找一个正则表达式来删除非ASCII字符,但保留字符串中的任何['_','-','+', '.']
。
以下适用于除['+', '.']
以外的所有
import re
text = 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-áéíóú'
re.sub(r'[^A-Za-z0-9_-]+','',text)
返回"ValidCharactersForPassword123_-AndRemoveNonAsci-",其中['+', '.']
已被移除,这是正确的。
我希望得到像'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
保留+和的正确语法是什么。从字符串中删除不匹配的字符时?
只需确保将所有字符添加到您想要从删除中腾出的负类中。请注意,您感兴趣的唯一需要在类中转义的字符是-
。但是,正如您已经在做的那样,我们可以将它移到类的末尾,以避免不得不逃离它。
# -*- coding: utf-8 -*-
import re
text = 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-áéíóú'
output = re.sub(r'[^A-Za-z0-9_+.-]+','',text)
print(output)
ValidCharactersForPassword123._-+.AndRemoveNonAscii-
你可以这样做
当你在字符类的end
或start
使用-
时,你不需要转义它,否则你需要转义它
[^A-Za-z0-9_+.-]+
代码
import re
text = 'ValidCharactersForPassword123._-+.AndRemoveNonAscii-áéíóú'
re.sub(r'[^A-Za-z0-9_+.-]+','',text)
演示
只是不要将转义的+
或.
(或任何其他re字符(放在-
之后,因为这可能会导致问题:
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-'