regex 如何删除字符串中所有不需要的空格,但保留像'\n'这样的符号?

xe55xuns  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(122)

我有这样一根弦:

s = 'Hello   \nWorld!\nToday is a wonderful day'

我需要这个:

'Hello \nWorld!\nToday is a wonderful day'

我尝试使用splitjoin如下:

' '.join('Hello   \nWorld!\nToday is a wonderful day'.split())

但我得到了这个

'Hello World!Today is a wonderful day'

正则表达式:

re.sub(r"\s+", " ", 'Hello   \nWorld!\nToday is a wonderful day')

都得到了同样的结果

jexiocij

jexiocij1#

你可以做几件事。
您可以简单地将至少一个空格的任何出现替换为单个空格:

re.sub(r'( )+', ' ', s)

要涵盖更多类型的(水平)空白,您可以包括制表符(\t)和提要(\f)字符(请参见regex101):

re.sub(r'[\t\f ]+', ' ', s)

或者,你可以不指定你想替换的字符,而是排除那些你不想替换的字符(双重否定!):

re.sub(r'[^\S\n\r]+', ' ', s)

在最后一个例子中,^表示列表中任何不存在的字符都应该被匹配,\S表示所有不存在的空格字符,\n\r是换行符和回车符。参见regex101

oo7oh9g9

oo7oh9g92#

使用str的方法,您可能会得到如下所需的输出:

s1= 'Hello   \nWorld!\nToday is a wonderful day'
' '.join(i for i in 'Hello   \nWorld!\nToday is a wonderful day'.split(' ') if i)

给予

'Hello \nWorld!\nToday is a wonderful day'

说明:在空格处拆分字符,然后使用解析过滤掉空字符串(它们确实来自相邻空格),然后连接剩下内容

xoefb8l8

xoefb8l83#

这里有两种方法来做到这一点的两种解释的问题。

第一次解释:如果一行中有两个或多个相同的空格字符,除了换行符(\n),请删除所有这些字符,只保留一个。

替换正则表达式的每个匹配项

([ \t\r\f\v])\1*(?=\1)

一个空字符串。
Demo
此正则表达式具有以下元素。

(               Begin capture group 1
  [ \t\r\f\v]   Match a whitespace other than a newline (`\n`)
)               End capture group 1
\1*             Match the character in character class 1 zero or more times 
(?=\1)          Positive lookahead asserts that the next character matches
                the content of character class 1

或者,将

([ \t\r\f\v])\1+

捕获组1的内容。
Demo
此正则表达式具有以下元素。

(              Begin capture group 1
  [ \t\r\f\v]  Match a whitespace character other than \n
)              End capture group 1
\1+            Match the content of capture group 1 one or more times

第二种解释:如果一行中有两个或多个空格字符,除了换行符(\s),删除除最后一个空格字符以外的所有空格字符。

替换正则表达式的每个匹配项

[ \t\r\f\v](?=[ \t\r\f\v])

一个空字符串。
Demo
此正则表达式具有以下元素。

[ \t\r\f\v]+    Match one or more whitespace characters other than `\n`
(?=             Begin a positive lookahead
  [ \t\r\f\v]   Match a whitespace character other than `\n`
)               End positive lookahead

或者,将

[ \t\r\f\v]{2,}

Demo
这个正则表达式的内容是,“匹配除换行符(\n)以外的空白字符两次或更多次,尽可能多。

相关问题