我有各种可能有多个前导空格的字符串。
string_1 = ' param A val A'
string_2 = 'param B val B'
....
Run Code Online (Sandbox Code Playgroud)
如果多个空格不在字符串的开头,我想用一个空格替换所有多个空格。
我希望上面的输出变成
string_1 = ' param A val A'z
string_2 = 'param B val B'
Run Code Online (Sandbox Code Playgroud)
我当前的解决方案无论如何都会用一个空格替换所有多个空格。
re.sub('\s+',' ',s)
Run Code Online (Sandbox Code Playgroud)
我将如何构造一个仅捕获非前导多个空格的模式?
您可以使用\b\s{2,}\b作为您的模式,如果这些多个空格领先,则它们不在单词边界内。对于多个空格也可以使用{2,}而不是+排除单个空格:
import re
string_1 = " param A val A"
string_2 = "param B val B"
pattern = re.compile(r"\b\s{2,}\b")
for test in (string_1, string_2):
print(pattern.sub(" ", test))
Run Code Online (Sandbox Code Playgroud)
输出:
param A val A
param B val B
Run Code Online (Sandbox Code Playgroud)
注意:尾随多个空格不会以这种方式更改。为此,您可以省略 last \bthen if 再次转换为单个空格。
正如@JvdV 所指出的,\b不考虑其他范围的字符。例如,如果您有一个类似 的字符串"[ param A val A ]",则上述模式将不适用于它。相反,您可以使用Positive Look Behind断言 ( (?<=\S)) 和Positive Look Ahead断言 ( (?=\S)) 来匹配任何非空白字符:
>>> import re
>>> text = "[ param A val A ]"
>>> re.sub(r"\b\s{2,}\b", " ", text)
'[ param A val A ]'
>>> re.sub(r"(?<=\S)\s{2,}(?=\S)", " ", text)
'[ param A val A ]'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
357 次 |
| 最近记录: |