在Python中重组字符串

2 投票
5 回答
960 浏览
提问于 2025-04-16 00:13

我想做类似这样的事情:

temp=a.split()
#do some stuff with this new list
b=" ".join(temp)

这里的a是原始字符串,而b是经过修改后的字符串。问题是,当我使用这种方法时,新的字符串会把换行符去掉。那么,我该怎么做才能保留换行符呢?

5 个回答

1

你需要使用正则表达式来把你的字符串拆分开。得到的匹配对象可以告诉你哪些部分符合不同的子表达式,以及它们在字符串中的位置。

因为你可能会有很多部分是用空格分开的,所以你需要在字符串的不同起始位置多次进行匹配。

如果这个回答让你感到困惑,我可以查找相关的资料并提供一些示例代码。我并不记得所有的库,只知道它们的功能。:-)

1

这要看你想要怎么分割内容。

如果你想要默认的分割方式,可以用换行符'\n'和空格' '作为分隔符,你可以使用

a.split(" ") 

如果你只想用空格作为分隔符的话。

http://docs.python.org/library/stdtypes.html#str.split

7

我猜你在第三行是想说 join(temp),而不是 join(a)

如果你想分割字符串,但又想保留分隔符,你需要用到 re.split 函数(或者RE对象的 split 方法),并且要用到捕获组:

>>> import re
>>> f='tanto va\nla gatta al lardo'
>>> re.split(r'(\s+)', f)
['tanto', ' ', 'va', '\n', 'la', ' ', 'gatta', ' ', 'al', ' ', 'lardo']

使用 re.split 得到的结果会在索引0、2、4等位置,而奇数索引的位置则是“分隔符”——也就是你用来最后重新连接列表的空格,这样可以保持和原字符串一样的空格格式(用 ''.join 来连接)。

你可以直接处理这些偶数索引的项,或者可以先把它们提取出来:

>>> x = re.split(r'(\s+)', f)
>>> y = x[::2]
>>> y
['tanto', 'va', 'la', 'gatta', 'al', 'lardo']

然后可以随意修改 y,例如:

>>> y[:] = [z+z for z in y]
>>> y
['tantotanto', 'vava', 'lala', 'gattagatta', 'alal', 'lardolardo']

最后再把它们放回去并连接起来:

>>> x[::2] = y
>>> ''.join(x)
'tantotanto vava\nlala gattagatta alal lardolardo'

注意,\n 的位置和它在原字符串中的位置是完全一致的,这正是我们想要的效果。

撰写回答