gpt4 book ai didi

正则表达式挑战,自定义国际象棋符号

转载 作者:行者123 更新时间:2023-12-02 21:26:51 25 4
gpt4 key购买 nike

Place a piece on the board (ex: Qld1 – place the white queen on D1, Kde8 – place the black king on E8).  Piece abbreviations are:
K = king
Q = queen
B = bishop
N = knight
R = rook
P = pawn
and l = light, d = dark.

Move a single piece on the board (ex: d8 h4 – moves the piece at D8 to the square at H4, c4 d6* - moves the piece at C4 to D6 and captures the piece at D6).
Move two pieces in a single turn (ex: e1 g1 h1 f1 – moves the king from E1 to G1 and moves the rook from H1 to F1. This is called a “king-side castle”).

我需要帮助编写一个正则表达式来获取列出的所有选项。我到目前为止:

([KQNBR]?([a-h]?[1-8]?x)?[a-h]([2-7]|[18](=[KQNBR])?)|0-0(-0)?)(\(ep\)|\+{1,2})?

([BKNPQR]?)([a-h]?)([0-9]?)([x=]?)([BKNPQR\*]|[a-h][1-8])( [+#]?)

在决定国际象棋棋盘将采用非常不同的自定义符号来处理移动之前。

问题是我需要帮助来创建一个正则表达式来验证这些国际象棋 Action 。

举个例子,这个程序不会实时操纵棋盘。但是,将从流中逐行读取文件,国际象棋游戏的控制台应用程序应读取每一行并为每个 Action 生成以下结果。

文件的前几行应该读取每个棋子的位置 Qld1 将白皇后放在 D1 上,kde8 将黑王放在 E8 上。

之后文件会读取每个 Action ,d8 h4会将d8位置的棋子移动到h4。

单个正则表达式将验证要读取的文本文件是否是基于其表达式的有效移动。如果无效,则跳过该移动并继续。

最佳答案

我创建了以下正则表达式,用于将复制的 chess24.com 游戏转换为 PGN-compatible游戏:

\s*(\d{1,3})\.?\s*((?:(?:O-O(?:-O)?)|(?:[KQNBR][1-8a-h]?x?[a-h]x?[1-8])|(?:[a-h]x?[a-h]?[1-8]\=?[QRNB]?))\+?)(?:\s*\d+\.?\d+?m?s)?\.?\s*((?:(?:O-O(?:-O)?)|(?:[KQNBR][1-8a-h]?x?[a-h]x?[1-8])|(?:[a-h]x?[a-h]?[1-8]\=?[QRNB]?))\+?)?(?:\s*\d+\.?\d+?m?s)?

替换字段为

\1. \2 \3\n 

或者

$1. $2 $3\n

取决于您的正则表达式环境或正则表达式引擎。

Python 中的详细正则表达式:

chess_pattern = re.compile(r"""
\s* # Whitespace
(\d{1,3}) # Capture group 1: Move number between 1 and 999 will precede white side's move.
\.? # Literal period, in case move numbers followed by a period. The replace pattern will restore period, so it is not captured.
\s* # Whitespace
( # Capture group 2: This will collect the white side's move
(?: # Start non-capturing group A: Use vertical bar | between non-capturing groups to check for castling, piece moves/captures, pawn moves/captures/promotion
(?:O-O(?:-O)?) # Non-capturing subgroup A1: For castling kingside or queenside. Change the O to 0 to work for sites that 0-0 for castling notation
|(?:[KQNBR][1-8a-h]?x?[a-h]x?[1-8]) # Non-capturing subgroup A2: For piece (non-pawn) moves and piece captures
|(?:[a-h]x?[a-h]?[1-8]\=?[QRNB]?) # Non-capturing subgroup A3: Pawn moves, captures, and promotions
) # End non-capturing group A
\+? # Allow plus symbol for checks (attacks on king)
) # End capturing group 2: White side's move
(?:\s*\d+\.?\d+?m?s)? # Non-capturing group B: Skip over move-times; it is possible to retain move times if you make this a capturing group
\.? # Allow period in case a time ends in a decimal point
\s* # Whitespace
( # Capture group 3: This will collect the black side's move
(?: # Start non-capturing group C: Use vertical bar | between non-capturing groups to check for castling, piece moves/captures, pawn moves/captures/promotion
(?:O-O(?:-O)?) # Non-capturing subgroup C1: For castling kingside or queenside. Change the O to 0 to work for sites that 0-0 for castling notation
|(?:[KQNBR][1-8a-h]?x?[a-h]x?[1-8]) # Non-capturing subgroup C2: For piece (non-pawn) moves and piece captures
|(?:[a-h]x?[a-h]?[1-8]\=?[QRNB]?) # Non-capturing subgroup C3: Pawn moves, captures, and promotions
) # End non-capturing group C
\+? # Allow plus symbol for checks (attacks on king)
)? # End capturing group 3: Black side's move. Question mark allows final move to be white side's move without any subsequent black moves
(?:\s*\d+\.?\d+?m?s)? # Non-capturing group D: Skip over move-times; it is possible to retain move times if you make this a capturing group
""",re.VERBOSE)
# Paste the entire chess game inside the raw string below where there is currently ...
chess_game = """
...
"""
print( pattern.sub(r'\1. \2 \3 '+'\n',chess_game) ) # Will output PGN to console
# The following writes the PGN to a file `game.pgn` in the working directory
output_PGN = open('game.pgn','w+')
output_PGN.write(pattern.sub(r'\1. \2 \3 '+'\n',chess_game))
output_PGN.close()

请参阅此处的实际示例:regexr.com/58ngb

我还将上述内容实现为 Clipboard Fusion (C#) 宏:https://www.clipboardfusion.com/Macros/View/?ID=d220984d-faa4-4ba2-ab86-f16dceb42036

关于正则表达式挑战,自定义国际象棋符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23638515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com