我想用\n
替换所有空格字符(""
除外)。我尝试使用\s+
的正则表达式,但它也与换行符匹配。
是否有任何方法可以在正则表达式\n
中跳过\s
?
答案 0 :(得分:2)
如果您不必考虑Unicode,可以使用
[ \t\r\f\v]
或者,由于\v
与VT(名称符号\x0b
)匹配,\r
也被视为换行符,\f
也是一种垂直行空格(现在虽然过时了 - (换页,\x0c
):
[ \t]
请参阅docs:
\s
如果未指定UNICODE
标志,则它与任何空白字符匹配,这相当于集[ \t\n\r\f\v]
。LOCALE
标志对空间的匹配没有额外的影响。如果设置了UNICODE
,这将匹配字符[ \t\n\r\f\v]
plus 在Unicode字符属性数据库中被归类为空格的任何内容。
如果您需要支持所有Unicode空间,请使用
\s(?<!\n)
此表达式将匹配任何非换行符的空格。
请参阅regex demo
如何向正速记字符类添加限制的另一个示例是在否定字符类中使用其相反的内容。 \S
是\s
的相反速记字符类,因此,我们应该将其放入[^...]
并*添加我们需要排除的\s
字符:
[^\S\n]
如果您需要排除所有换行符,请添加\r
,\v
等。 [^\S\n]
匹配除非空白(=匹配任何空格)和换行符之外的任何字符。
答案 1 :(得分:1)
它是said in the document that \s
matches [ \t\n\r\f\v]
。所以你只需要替换&#39; \ s +&#39;到 [\ t \ r \ n \ f \ v] + 以跳过\ n。
答案 2 :(得分:1)
您可以使用否定字符类[^\S\n]
,其中\S
不是空格:
re.sub(r'[^\S\n]', '', s)
答案 3 :(得分:0)
\s
匹配[\r\n\t\f ]
,如果您只想要空格,可以使用以下内容:
>>> re.sub(' ', '', 'test string\nwith new line')
由于' '
匹配空格(字面意思),这将删除所有空格,但会保留\n
字符。
答案 4 :(得分:0)
是否有任何方法可以在正则表达式
\n
中跳过\s
?
您可以使用否定前瞻。
re.sub(r'(?!\n)\s', '', s)
如果您还想跳过回车,请在否定先行内添加\r
。
re.sub(r'(?!\n|\r)\s', '', s)
这就像是一种减法。即,上面的正则表达式会从\n
\r
,\s