如何删除多个子串?

时间:2015-03-24 04:37:05

标签: python string

我正在编写一个脚本,从PGN文件中获取一些信息,这是一种用于描述国际象棋游戏的格式。我正试图将每个游戏的动作分别复制到另一个文件中。

但有时会有注释,标有'{'和'}'字符,我想从字符串中删除它们(我正在将文件的每一行复制成一个字符串,以便在写入之前进行一些调整在输出文件上。)

此格式的字符串示例如下:

'1.e4 {some comment} c5 2.Nf3 d6 3.d4 {another comment} Nxd4 {you got it}'

我的第一个解决方案就是:

my_string = my_string.replace(my_string[my_string.find('{'):my_string.find('}')], '')

不幸的是,这只删除了第一组评论,如下所示:

'1.e4 } c5 2.Nf3 d6 3.d4 {another comment} Nxd4 {you got it}'

(剩下的'}'不是问题,可以删除:

my_string = my_string.replace('}', '')

所以我试着遍历字符串:

for char in my_string:
    if char == '{':
        my_string = my_string.replace(my_string[my_string.find('{'):my_string.find('}')], '')

同样的事情发生了,只删除了第一组评论。

然后我尝试了一个while循环:

while my_string.find('{') != -1:
    my_string = my_string.replace(my_string[my_string.find('{'):my_string.find('}')], '')

现在我陷入无限循环......

任何人都知道如何解决这个问题?我也接受一个列表的解决方案,我可以嵌入其中:

temp_list = list(my_string)
#solution with list manupulation
my_string = ''.join(temp_list)

3 个答案:

答案 0 :(得分:3)

正则表达式非常适用于此。

import re
re.sub(r'\s*{.*?}\s*', ' ', my_string)
# '1.e4 c5 2.Nf3 d6 3.d4 Nxd4 '

“替换任意数量的空格,开放的卷曲,最少可能的任何数量(除了换行符),然后是一个封闭的卷曲和任意数量的具有单个空格的空格”

答案 1 :(得分:0)

作为对另一个答案的补充说明,如果要解析复杂的格式(因为PGN和许多其他格式一样),你应该考虑使用通用的解析库,而不是编写自己的ad-hoc解析器。这将允许您重用库编写者为您编写和调试的共享逻辑。解析是一个用例的极端例子,多年来经历了大量的研究,通过利用适当的库,您可以在自己的项目中受益于这项研究。 This list on the official Python wiki提出了许多可能的选择。 This blog post提供了一些热门选项的评论。

答案 2 :(得分:0)

请注意,您的尝试将离开最终的}。这是因为my_string.find('}')返回}的索引,但replace函数替换了所有但不包括索引

因此,您需要将结束索引增加1:

my_string = my_string.replace(my_string[my_string.find('{'):my_string.find('}')+1], '')

@Amadan's answer所示,我可能只是使用正则表达式进行此练习。