用模式分割字符串

2024-06-10 18:06:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我想根据模式将字符串拆分为单独的列表。假设我让绳子看起来像这样

string = '1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8   1-1 1.c2 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5  1-0 1.b5 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5 12.Nb5  1/2-1/2' 

模式应该将1.识别为开始,并在另一个1.之前结束

[1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8   1-1]
[1.c2 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5  1-0]
[1.b5 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5 12.Nb5  1/2-1/2]

我是这样做的

lists=[]
reg = '^\\1\\.'
for i in string :
  re.match(reg, i)
    lists.extend[i]

Tags: d6d4e5g6e6nf3nf6nc3
2条回答
string = '1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8   1-1 1.c2 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5  1-0 1.b5 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5 12.Nb5  1/2-1/2'

print([['1.'+i] for i in (" "+string).split(' 1.')][1:])

这也很好用

我将在这里使用re.findall和模式.*?\s+\d+(?:/\d+)?-\d+(?:/\d+)?

string = '1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8   1-1 1.c2 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5  1-0 1.b5 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5 12.Nb5  1/2-1/2'
parts = re.findall(r'(.*?\s+\d+(?:/\d+)?-\d+(?:/\d+)?)\s*', string)
print(parts)

这张照片是:

['1.e4 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8   1-1',
 '1.c2 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5  1-0',
 '1.b5 d6 2.d4 Nf6 3.Nc3 g6 4.Nf3 Bg7 5.Be2 Nbd7 6.O-O O-O 7.e5 dxe5 8.dxe5 Ng4 9.e6 Nde5 10.Qxd8 Rxd8 11.Nxe5 Nxe5 12.Nb5  1/2-1/2']

下面是对所使用的正则表达式模式的简要说明:

(                 match and capture
    .*?           all content up to the nearest
    \s+           whitespace
    \d+(?:/\d+)?  followed by e.g. 1 or 1/2
    -             dash
    \d+(?:/\d+)?  another 1 or 1/2
)                 stop capture
\s*               match, but do not capture, optional whitespace

相关问题 更多 >