如何使用Python正则表达式提取两个子串之间的特定字符串?
正则匹配问题:提取review:与...之间的内容
嘿,我来帮你搞定这个正则匹配的坑!首先先明确你的需求和遇到的问题:
我需要提取"review: "与"..."之间的字符串,输入内容是:
review: I love you very much... reviewer:jackson review: I hate you very much... reviewer:madden review: sky is pink and i ... reviewer: tom
预期提取结果为:I love you very much、I hate you very much、sky is pink and i
我尝试使用正则表达式re.findall("review(.*)...",string)但匹配失败,得到的结果包含了大量多余内容。
为什么你的正则会失效?
你用的(.*)是贪婪匹配——它会尽可能匹配最长的内容,所以从第一个review开始,会一直匹配到最后一个...之前的所有字符,自然就把中间的其他无关内容也包含进去了,这显然不是你想要的。
正确的解决方案
我们需要用非贪婪匹配来限制匹配范围,同时精准定位开头的review: 和结尾的...。试试这个正则表达式:
import re target_string = "review: I love you very much... reviewer:jackson review: I hate you very much... reviewer:madden review: sky is pink and i ... reviewer: tom" # 使用非贪婪匹配的正则 matches = re.findall(r'review: (.*?)\.\.\.', target_string) print(matches)
运行这段代码,你会得到:
['I love you very much', 'I hate you very much', 'sky is pink and i ']
优化小技巧
注意最后一个结果末尾有个空格(因为原文本里是sky is pink and i ...),如果想去掉多余的空格,可以在提取后用strip()处理结果:
clean_matches = [match.strip() for match in matches] print(clean_matches) # 输出: ['I love you very much', 'I hate you very much', 'sky is pink and i']
正则细节解释
review::精准匹配开头的标识,确保我们从正确的位置开始提取(.*?):非贪婪匹配模式,匹配到第一个...就停止,不会过度匹配后续内容\.\.\.:转义后的三个点,因为.在正则中是匹配任意字符的特殊符号,必须转义才能匹配实际的英文句号
内容的提问来源于stack exchange,提问作者Super-ilad
相关产品推荐
相关产品推荐

