Python正则表达式将替换不是字母或空格的任何字符

问题描述 投票:0回答:2

我正在尝试将所有非字母和非空格替换为”。我认为以下代码在许多测试用例中都能正常工作,但是,在涉及特殊的转义字符时,它失败了。

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

所以我现在看到我的代码说〜找到不是字母且不在上述特殊字符集中的任何东西,然后将其替换为''。

所以有办法保留空白但删除其他特殊字符吗?

python regex
2个回答
1
投票

因此,以下内容在您的模式中是错误的,让我们先解决它们

[^A-z ^\s]
  • [A-z-它包括从A到z的ascii表中的所有字符,也包含我们不希望匹配的非字母字符,因此如果我们只想使用大写字母,则正确的字符应为[A-Z],如果我们需要大写和小写,则应该为[A-Za-z]或打开i标志
  • [^\s-^”仅在将其用作字符类中其他位置的第一个字符时才表示取反,将其视为文字^

所以您的正则表达式应该是

 [^A-Za-z\s]

1
投票

要匹配所有非单词和非空格字符,可以使用[^\w\s]-\w是任何字母,数字或下划线,而\s是空格。如果您只想收到字母,可以改用[^a-zA-Z\s]

(此外,当您要对捕获组进行否定时,只需要在开始处放置^。]

© www.soinside.com 2019 - 2024. All rights reserved.