对于一个小项目,我试图将象棋游戏字符串转换为国际象棋动作的list。给定的字符串可能如下所示:s="1. e4 e5 2. Nf3 Nf6 3. Nc3 d6 4. Bc4 h6 5. d3 Be7 6. Be3 Nc6"
。
现在,我想知道是什么最有效的方法来去除我们在游戏中的移动对中的整数(例如"1."
),而不是指示棋子移动到哪个领域的整数(例如"e4"
)。
我目前的做法如下:
s = s.replace('.', '').split(" ")
s = [e for e in s if not e.isdigit()]
如果我不想转换成列表,而只是删除上面提到的特定部分,我将如何有效地做到这一点?为此,我可以使用re
的正则表达式吗?
发布于 2020-05-05 09:54:47
您可以使用endswith
检查以.
结尾的子字符串。
s="1. e4 e5 2. Nf3 Nf6 3. Nc3 d6 4. Bc4 h6 5. d3 Be7 6. Be3 Nc6"
s = " ".join([substr for substr in s.split() if not substr.endswith('.')])
输出:'e4 e5 Nf3 Nf6 Nc3 d6 Bc4 h6 d3 Be7 Be3 Nc6'
发布于 2020-05-05 10:00:36
为此,您可以使用re.split
,方法如下:
import re
s = "1. e4 e5 2. Nf3 Nf6 3. Nc3 d6 4. Bc4 h6 5. d3 Be7 6. Be3 Nc6"
moves = re.split(r'\s*\d+\.\s*', s)
print(moves)
输出:
['', 'e4 e5', 'Nf3 Nf6', 'Nc3 d6', 'Bc4 h6', 'd3 Be7', 'Be3 Nc6']
请注意,我使用了所谓的原始字符串(或r-字符串),因此不必转义\
,我使用的模式可能是:
.
(这需要转义,因为.
在模式中有特殊的意义)如果您喜欢交互式解释,可以将该模式粘贴到regex101.com中。请注意,在移动开始时有空的str
,但是使用列表切片(即moves = moves[1:]
)可以很容易地删除它。
https://stackoverflow.com/questions/61610155
复制相似问题