繁体   English   中英

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

[英]Python regex to replace any characters that are not either letters or white space

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

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

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

那么有没有办法保留空格但删除其他特殊字符?

要匹配所有非单词和非空白字符,可以使用[^\w\s] - \w是任何字母、数字或下划线, \s是空格。 如果您只想获取字母,则可以使用[^a-zA-Z\s]代替。

(另外,当你否定一个捕获组时,你只需要把^放在最开始。)

因此,您的模式中有以下错误,让我们先解决它们

  • Az - 它包括从 A 到 z 开始的 ascii 表中的所有字符,其中也有我们不想匹配的非字母字符,所以如果我们只想要大写字母,正确的应该是[AZ] ,如果我们想要两者大写和小写然后它应该是[A-Za-z]或者你可以打开i标志
  • ^\s - ^仅当您将其用作字符 class 中的第一个字符时才表示否定,在其他地方它被视为文字^

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

 [^A-Za-z\s]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM