我正在尝试将所有非字母和非空格替换为”。我认为以下代码在许多测试用例中都能正常工作,但是,在涉及特殊的转义字符时,它失败了。
import re
def process_text(text):
text = text.lower()
text = re.sub(pattern='[^A-z ^\s]',repl='',string=text).split(' ')
return [word for word in text if word != '']
process_text('abc 123')
>>>> ['abc'] # this is what I wanted.
process_text('abc 123 \n')
>>>> ['abc', '\n'] # I don't want the new line character.
下面的链接告诉我\ s是任何空格。https://www.debuggex.com/cheatsheet/regex/python
但是,官方文档说\ s等同于“匹配任何空格字符;这等同于[\ t \ n \ r \ f \ v]。”https://docs.python.org/3/howto/regex.html
所以我现在看到我的代码说〜找到不是字母且不在上述特殊字符集中的任何东西,然后将其替换为''。
所以有办法保留空白但删除其他特殊字符吗?
因此,以下内容在您的模式中是错误的,让我们先解决它们
[^A-z ^\s]
A-z
-它包括从A到z的ascii表中的所有字符,也包含我们不希望匹配的非字母字符,因此如果我们只想使用大写字母,则正确的字符应为[A-Z]
,如果我们需要大写和小写,则应该为[A-Za-z]
或打开i
标志^\s
-^
”仅在将其用作字符类中其他位置的第一个字符时才表示取反,将其视为文字^
所以您的正则表达式应该是
[^A-Za-z\s]
要匹配所有非单词和非空格字符,可以使用[^\w\s]
-\w
是任何字母,数字或下划线,而\s
是空格。如果您只想收到字母,可以改用[^a-zA-Z\s]
。
(此外,当您要对捕获组进行否定时,只需要在开始处放置^
。]