Python Forsyth-Edwards符号中的分组空间

Python Forsyth-Edwards符号中的分组空间,python,string,Python,String,在中,我有这样一个字符串: string = rnbqkbnr/pppppppp/********/********/********/********/PPPPPPPP/RNBQKBNR string = rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR string = rnbqkbnr/pppppppp/*r*****/****p***/********/*******/PPPPPPPP/RNBQKBNR 其中,*表示一个空白。 它需要这样表示:

在中,我有这样一个字符串:

string = rnbqkbnr/pppppppp/********/********/********/********/PPPPPPPP/RNBQKBNR
string = rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
string = rnbqkbnr/pppppppp/*r*****/****p***/********/*******/PPPPPPPP/RNBQKBNR
其中,
*
表示一个空白。 它需要这样表示:

string = rnbqkbnr/pppppppp/********/********/********/********/PPPPPPPP/RNBQKBNR
string = rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
string = rnbqkbnr/pppppppp/*r*****/****p***/********/*******/PPPPPPPP/RNBQKBNR
其中“8”表示空空间的数量

例如,给定如下字符串:

string = rnbqkbnr/pppppppp/********/********/********/********/PPPPPPPP/RNBQKBNR
string = rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
string = rnbqkbnr/pppppppp/*r*****/****p***/********/*******/PPPPPPPP/RNBQKBNR
结果应该是:

string = rnbqkbnr/pppppppp/1r6/4p3/8/8/PPPPPPPP/RNBQKBNR

有人能帮我找到正确的方向吗?

首先想到的是。匹配空格序列的正则表达式就是
\s+
,您可以使用或替换匹配项(即空格序列),以任意方式替换。您可以给
sub()
一个函数作为替换值,并且将对每个函数调用该函数以计算实际替换

re.sub(r'\s+', lambda m: str(m.end() - m.start()), string)

如果没有正则表达式,您可以使用with list CONTRUMENT expression获得与以下相同的结果:

from itertools import groupby, chain
s = 'rnbqkbnr/pppppppp/*r*****/****p***/********/*******/PPPPPPPP/RNBQKBNR'

new_str = ''.join(chain(*[[str(len(list(j)))] if i else list(j) \     
                      for i, j in groupby(s, lambda x: x=='*')]))
更干净的版本可以使用显式
for
循环编写为:

my_string = 'rnbqkbnr/pppppppp/*r*****/****p***/********/*******/PPPPPPPP/RNBQKBNR'
new_list = []

for is_blank, group in groupby(my_string, lambda x: x=='*'):
    temp_list = list(group)
    if is_blank:
        temp_list = [str(len(temp_list))]
    new_list.extend(temp_list)

new_str = ''.join(new_list)
new\u str
持有的最终值为:

>>> new_str
'rnbqkbnr/pppppppp/1r5/4p3/8/7/PPPPPPPP/RNBQKBNR'

您可以使用
re.sub
并将匹配项的长度替换为字符串:

import re
s = re.sub("\\*+", lambda x: str(len(x.group(0))), s)

如果我理解正确,那么你的第二个例子是错误的——看起来你在第三和第六列中缺少了一个正方形。期望的输出与输入也不匹配;您使用的是
1r7
,而不是
1r5
(对应于您所写的内容)或
1r6
(应该是)。同样,如果我正确理解了符号,我不确定我是否理解。@DavidZ-我怀疑这只是OP试图运行替换的一个虚构值。最后一个例子并没有描述一个合法的棋盘位置,因为棋盘上有3辆黑色的车和9辆黑色的棋子,额外的棋子已经移动了,但是白色的棋子还没有移动。我明白了,你是对的。我打错了。正确的必须是1r6,我已经纠正了。是的,例如,它是一个虚构的值。谢谢,您可以在匹配中使用
len
,而不是自己进行算术运算。不,匹配对象没有
\u len\u()
方法。(相信我,我检查过。)根据我的回答,我的意思是在第一组。是的,但是这样做比减去结束和开始位置没有特别的优势。这是一个意见问题,但我认为如果你使用
len
,意图会更清楚,而做你自己的算术只是引入错误的另一种方式。