Python如何查找字符串中两个特殊字符间的多段内容并计数?
解决Python提取多段括号内内容的问题
嗨,别担心,初学者遇到这种问题太正常啦!让我帮你拆解一下问题所在,再给出可行的解决方案~
你的问题回顾
你想要提取字符串中(和)之间的所有内容,同时统计这些内容的实例数量。你写的代码如下:
import re count=0 myString="abcde(fghi)defggdfsidf(ijkl)gfders(gkjh)hgstfvd" startString = '(' endString = ')' for item in myString: portString=myString[myString.find(startString)+len(startString):myString.find(endString)] print(portString) count=count+1
你期望的输出是:
fghi ijkl gkjh
但实际每次循环都只输出fghi,而且循环次数还不对,对吧?
问题出在哪?
你的代码有两个核心问题:
- 查找位置固定:
myString.find(startString)和myString.find(endString)每次都是从字符串最开头开始查找匹配的字符,所以不管循环多少次,拿到的永远是第一对括号里的内容。 - 循环逻辑错误:你遍历的是
myString的每个字符,这完全没必要——循环次数会等于字符串的总长度,最后count的数值也会远远大于实际的实例数量。
解决方案
这里给你两种常用的解决方法,按需选择:
方法一:用正则表达式(最简洁高效)
正则表达式可以一次性匹配所有符合(...)格式的内容,直接提取括号内的部分,非常适合这种场景:
import re myString = "abcde(fghi)defggdfsidf(ijkl)gfders(gkjh)hgstfvd" # 匹配(和)之间的内容,非贪婪模式避免匹配到最后一个) matches = re.findall(r'\((.*?)\)', myString) count = len(matches) # 输出结果 print(' '.join(matches)) print(f"实例数量:{count}")
代码解释:
r'\((.*?)\)':\(和\)是转义后的括号(因为括号在正则里有特殊语法含义);(.*?)是非贪婪匹配,意思是匹配任意字符直到遇到第一个)为止,确保每一对括号的内容都被单独提取。re.findall()会返回所有匹配到的内容组成的列表,列表的长度就是你要统计的实例数量。
方法二:手动遍历(不用正则的实现)
如果你想手动实现这个逻辑,可以通过记录每次查找的起始位置,避免重复匹配开头的括号:
myString = "abcde(fghi)defggdfsidf(ijkl)gfders(gkjh)hgstfvd" start_char = '(' end_char = ')' count = 0 results = [] current_pos = 0 while True: # 从当前位置开始找下一个( start_idx = myString.find(start_char, current_pos) if start_idx == -1: break # 找不到更多(,退出循环 # 从(的下一个位置找对应的) end_idx = myString.find(end_char, start_idx + 1) if end_idx == -1: break # 找不到匹配的),退出循环 # 提取括号内的内容 content = myString[start_idx + 1 : end_idx] results.append(content) count += 1 # 更新起始位置为当前)的下一个字符,下次从这里开始查找 current_pos = end_idx + 1 print(' '.join(results)) print(f"实例数量:{count}")
代码解释:
- 通过
current_pos变量记录每次查找的起始位置,每找到一对括号后,就把current_pos更新为)的下一个字符,这样下次查找就会从下一段内容开始,不会重复匹配第一对括号。 - 用
while True循环直到找不到更多的(或对应的)为止,确保所有符合条件的内容都被提取。
内容的提问来源于stack exchange,提问作者H.K
相关产品推荐
相关产品推荐

