Python中如何循环提取相邻两个指定标记字符间的子串
同标记字符间多段内容截取的实现方案
针对需要循环遍历整个字符串、逐对匹配起止标记、提取中间内容的需求,提供两种可直接落地的实现:
基于原有单次截取逻辑的循环改造
你现有单次截取的核心逻辑可以直接复用,只需要补上循环边界控制:每次截取完成后,把下一次的搜索起点移动到当前截取段结束的标记位置,同时增加找不到后续标记时的终止判断,避免索引报错。
改造后的完整可运行代码:
start_marker = end_marker = 'o' string = "ovdasdaso je ovakvo okovano okej" result = [] # 初始搜索起点设为字符串开头 search_pos = 0 while True: try: # 从当前搜索位置往后找下一个起始标记 start = string.index(start_marker, search_pos) + len(start_marker) # 从起始标记的下一位开始找匹配的结束标记 end = string.index(end_marker, start) # 将截取到的内容存入结果列表 result.append(string[start:end]) # 更新下一轮的搜索起点为当前结束标记的位置 search_pos = end except ValueError: # 遍历到字符串末尾、找不到下一个标记时终止循环 break print(result)
运行后得到的结果完全匹配预期:['vadasdas', 'vakv', 'k', ' ']
更简洁的正则实现
如果不需要手动控制每一步的索引扫描逻辑,可以直接用正则的非贪婪匹配完成提取,代码量更少:
import re string = "ovdasdaso je ovakvo okovano okej" # 匹配成对出现的o,提取两个o之间的任意内容 result = re.findall(r'o(.*?)o', string) print(result)
实现说明
- 正则中的
.*?是非贪婪匹配规则,会在遇到第一个匹配的结束标记时就停止匹配,不会跨段抓取多个标记间的内容,刚好符合成对截取的需求 - 如果标记是包含正则特殊字符的内容(比如
.、*、+),可以用re.escape(标记内容)做转义处理,避免模式匹配失效
内容的提问来源于stack exchange,提问作者User 123
相关产品推荐
相关产品推荐

