分离字符串前面的空白字符

3
我将尝试创建一个函数来分割字符串中的一部分(前导空格),以便我可以使用脚本的不同部分进行编辑,然后在修改后再将其添加回字符串中。我不确定如何准确地传达我的意思。
假设我有以下字符串:
"    That's four spaces"

我想把它分开,以便得到以下结果:
"    " and "That's four spaces"

re.split(r"^(\s+)", " That's four spaces", 1) 几乎可以实现你想要的效果,但是返回的数组开头有一个额外的空字符串。我想不到更好的方法了。 - zwol
4个回答

2
你可以使用 re.match
>>> import re
>>> re.match('(\s*)(.*)', "    That's four spaces").groups()
('    ', "That's four spaces")
>>>

(\s*)捕获字符串开头的零个或多个空白字符,(.*)捕获其余所有内容。

但请记住,在Python中,字符串是不可变的。技术上讲,你不能“编辑”它们的内容;只能创建新的字符串对象。


对于非正则表达式的解决方案,你可以尝试这样做:
>>> mystr = "    That's four spaces"
>>> n = next(i for i, c in enumerate(mystr) if c != ' ') # Count spaces at start
>>> (' ' * n, mystr[n:])
('    ', "That's four spaces")
>>>

这里的主要工具是nextenumerate和一个生成器表达式。这种解决方案可能比正则表达式更快,但我个人认为第一种更优雅。

1
为什么不尝试匹配而不是拆分?
>>> import re
>>> s = "    That's four spaces"
>>> re.findall(r'^\s+|.+', s)
['    ', "That's four spaces"]

解释:

  • ^\s+ 匹配一行开头的一个或多个空格。
  • | 或者
  • .+ 匹配剩余的所有字符。

我很想这样做,但我必须在没有除sys之外的任何导入的情况下完成我的最终产品。 - user4204014

1
一种解决方案是对字符串进行lstrip操作,然后确定你已经删除了多少个字符。然后您可以按照需要“修改”字符串,并最后将空格添加回字符串中。我认为这在制表符方面可能无法正常工作,但仅适用于空格似乎可以完成工作:
my_string = "    That's four spaces"
no_left_whitespace = my_string.lstrip()
modified_string = no_left_whitespace + '!'
index = my_string.index(no_left_whitespace)
final_string = (' ' * index) + modified_string

print(final_string) #     That's four spaces!

还有一个简单的测试,以确保我们做得正确,测试通过:

assert final_string == my_string + '!'

1
一旦您有了 no_left_whitespace,您可以直接使用 left_whitespace = my_string[:len(my_string)-len(no_left_whitespace)],而无需任何中间步骤。 - DSM

0

你可以做的一件事是将字符串转换为列表。也就是:

x="    That's four spaces"
y=list(x)
z="".join(y[0:4]) #if this is variable you can apply a loop over here to detect spaces from start
k="".join(y[4:])
s=[]
s.append(z)
s.append(k)
print s

这是一个非正则表达式的解决方案,不需要任何导入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接