正则表达式捕获可变数量扑克牌字符组问题求助
解决方案
核心思路
你遇到的问题是重复捕获组仅会保留最后一次匹配结果,因此需要先匹配整个牌组的原始内容,再拆分出每张牌;或者结合全局匹配直接提取所有牌项。以下是适配需求的正则方案:
整行匹配正则(提取玩家、动作、牌组)
^(.*?)\s?:\s?(folds|checks)(?:\s+\[((?:[\dJQKTAdsch]{2}\s*)+)\])?\s*$
分组说明:
- 第1组:玩家名称(匹配冒号前的所有内容,自动忽略前后冗余空格)
- 第2组:动作(精确匹配
folds或checks) - 第3组:可选牌组内容(匹配方括号内的所有牌字符串,比如
Ah 4d 6s)
拿到第3组内容后,再用[\dJQKTAdsch]{2}做全局匹配,即可拆分出每张单独的牌。
单独提取牌的正则(针对[Ah 4d 6s]这类字符串)
如果只需要从带方括号的牌组中提取单张牌,直接用全局匹配以下正则即可:
[\dJQKTAdsch]{2}
该正则不受方括号和空格影响,能精准匹配所有符合规则的牌。
示例用法(Python)
import re # 匹配整行的正则 line_regex = re.compile(r'^(.*?)\s?:\s?(folds|checks)(?:\s+\[((?:[\dJQKTAdsch]{2}\s*)+)\])?\s*$') # 提取单张牌的正则 card_regex = re.compile(r'[\dJQKTAdsch]{2}') test_data = [ "mddgfc: checks ", "Tomi1981: folds ", "DJPOPS613: folds [Ad] ", "DJPOPS613: folds [Qh Qc] ", "SchuDani: folds [2c As Ts] ", "anshovel: folds [Ad 5d 4h 8h] ", "pokerpummi: folds [2c 5h Ac 6d 7s]" ] for line in test_data: match_result = line_regex.match(line) if match_result: player = match_result.group(1) action = match_result.group(2) card_raw = match_result.group(3) cards = card_regex.findall(card_raw) if card_raw else [] print(f"{player}: {action} {cards}")
输出结果:
mddgfc: checks [] Tomi1981: folds [] DJPOPS613: folds ['Ad'] DJPOPS613: folds ['Qh', 'Qc'] SchuDani: folds ['2c', 'As', 'Ts'] anshovel: folds ['Ad', '5d', '4h', '8h'] pokerpummi: folds ['2c', '5h', 'Ac', '6d', '7s']
原正则错误原因
你之前写的\[([\dJQKTAdsch]{2}){1,}\]中,([\dJQKTAdsch]{2}){1,}属于重复捕获组,正则引擎仅会记录该组最后一次匹配的内容(比如[Ah 4d 6s]只会抓到6s)。解决思路要么将重复内容包裹进一个非捕获组的大容器中(如\[((?:[\dJQKTAdsch]{2}\s*)+)\]),要么用全局匹配单独提取每张牌。
内容的提问来源于stack exchange,提问作者mgillett
相关产品推荐
相关产品推荐

