正则表达式提取竖线分隔字符串第n个Token及计数方法咨询
嘿,作为正则新手碰到这种带连续空Token的分割场景确实容易卡壳,我来一步步帮你解决问题~
一、提取指定位置的Token(包括空字符串)
当然存在满足需求的正则!你的目标字符串按|分割后,Token列表是:
AA''(空)CCCCCCCC''(空)''(空)FFFFFFFFFFF
要提取第N个Token,可以用这个通用正则模板:
^((?:[^|]*\|){N-1})([^|]*)
(?:[^|]*\|):非捕获组,匹配「任意非|字符+一个|」的组合,用?:避免生成多余的捕获组{N-1}:重复这个组合N-1次,跳过前N-1个Token的内容([^|]*):捕获第N个Token的内容(包括空字符串,因为*允许匹配0个字符)
示例:
- 提取第4个Token,用正则:
^((?:[^|]*\|){3})([^|]*),捕获组2就是空字符串'' - 提取第6个Token,用正则:
^((?:[^|]*\|){5})([^|]*),捕获组2就是FFFFFFFFFFF
用Python代码验证:
import re text = "AA||CCCCCCCC|||FFFFFFFFFFF" # 提取第4个Token match_4 = re.match(r"^((?:[^|]*\|){3})([^|]*)", text) print(repr(match_4.group(2)) if match_4 else "无匹配") # 输出 '' # 提取第6个Token match_6 = re.match(r"^((?:[^|]*\|){5})([^|]*)", text) print(repr(match_6.group(2)) if match_6 else "无匹配") # 输出 'FFFFFFFFFFF'
二、用正则高效统计Token总数
你原来的方法需要循环判断,确实可以用正则更高效地实现,有两种简单思路:
方法1:统计分隔符数量+1
因为每一个|都是分隔符,不管连续多少个,总Token数 = 分隔符|的数量 + 1。比如你的字符串里有5个|,5+1=6,正好是Token总数。
代码示例:
pipe_count = len(re.findall(r"\|", text)) token_count = pipe_count + 1 print(token_count) # 输出 6
方法2:直接匹配所有Token后计数
用正则匹配所有Token(包括空的),然后取匹配结果的长度:
tokens = re.findall(r"(?:^|\|)([^|]*)", text) print(len(tokens)) # 输出 6
这个正则的逻辑是:从字符串开头或|开始,匹配后续所有非|字符(包括0个,也就是空字符串),每一次匹配对应一个Token。
内容的提问来源于stack exchange,提问作者Pedro Vaquero
相关产品推荐
相关产品推荐

