![](/img/trans.png)
[英]Python regex replace space from string if surrounded by numbers, but not letters
[英]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.