字符串分割需求:按指定字段拆分特殊格式的目标字符串
解决方案:拆分特定格式字符串到指定字段
我之前处理过不少类似的复杂字符串拆分需求,这种包含可变内容(带空格、点号的名称、带空格的城市)和特殊分隔符(双空格)的场景,用正则表达式来精准匹配是最省心的方案。
核心思路
根据你给出的格式规则:Name[空格]-[空格]City[空格]Points[双空格]Score[空格]Cards,我们可以用带命名分组的正则来直接捕获每个字段,完美处理名称、城市里的空格/点号,以及数值可能为负数的情况。
正则表达式模式
^(?P<name>.+?) - (?P<city>.+?) (?P<points>-?\d+) (?P<score>-?\d+) (?P<cards>-?\d+)$
模式拆解:
(?P<name>.+?):非贪婪匹配任意字符,直到遇到-(空格-空格),精准捕获包含空格、点号的完整名称-:匹配分隔名称和城市的固定分隔符(?P<city>.+?):非贪婪匹配任意字符,直到遇到后续数值前的空格,捕获带空格的城市名称(?P<points>-?\d+):匹配可正可负的Points数值,-?表示可选负号,\d+匹配1个或多个数字:严格匹配Points和Score之间的双空格分隔符(?P<score>-?\d+):同理匹配可正可负的Score数值(?P<cards>-?\d+):匹配可正可负的Cards数值
代码示例(Python)
下面是可直接运行的代码,会把每个字符串拆分为字典格式,还能把数值字段转为整数类型:
import re # 定义正则模式 pattern = r'^(?P<name>.+?) - (?P<city>.+?) (?P<points>-?\d+) (?P<score>-?\d+) (?P<cards>-?\d+)$' # 测试字符串列表 test_strings = [ "Paul Grid - Hong Kong 56 663 0", "Anna Grid - Tokyo 16 363 0", "Greg H.Johs - Hong Kong -6 363 4", "Jessy Holm Smith - Jakarta 8 261 0" ] # 遍历处理每个字符串 for s in test_strings: match_result = re.match(pattern, s) if match_result: # 转为字典格式,方便提取字段 field_dict = match_result.groupdict() # 将数值字段转为整数(按需选择) field_dict['points'] = int(field_dict['points']) field_dict['score'] = int(field_dict['score']) field_dict['cards'] = int(field_dict['cards']) print(f"处理结果:{field_dict}")
运行输出
处理结果:{'name': 'Paul Grid', 'city': 'Hong Kong', 'points': 56, 'score': 663, 'cards': 0} 处理结果:{'name': 'Anna Grid', 'city': 'Tokyo', 'points': 16, 'score': 363, 'cards': 0} 处理结果:{'name': 'Greg H.Johs', 'city': 'Hong Kong', 'points': -6, 'score': 363, 'cards': 4} 处理结果:{'name': 'Jessy Holm Smith', 'city': 'Jakarta', 'points': 8, 'score': 261, 'cards': 0}
补充说明
如果Points和Score之间的空格偶尔出现多于2个的情况,可以把正则里的 改成\s{2,}(匹配2个及以上空格),这样兼容性更强,但按照你给出的规则,双空格的写法已经足够精准。
内容的提问来源于stack exchange,提问作者MdTp
相关产品推荐
相关产品推荐

