如何用Python从有效的<document>标签对中提取文本?
如何用Python从有效的标签对中提取文本?
嘿,我明白你的问题了——你的文本里有好几个<document>起始标签,但只有一个闭合的</document>,现在用正则提取的时候,会把从第一个<document>开始到闭合标签的所有内容都抓出来,这显然不是你想要的有效配对内容对吧?
给你两个简单的解决办法,都能精准拿到最后一个<document>和</document>之间的文本:
方法一:调整正则表达式(精准匹配最后一对标签)
我们可以用负向前瞻来确保匹配的是最后一个<document>标签,这样就不会把前面未闭合的标签内容也带进来:
import re with open('data.txt', 'r') as f: text = f.read() # 匹配最后一个<document>到</document>之间的内容 match_result = re.search(r"<document>(?!.*<document>)(.*?)</document>", text, re.DOTALL) if match_result: # 提取内容并去除首尾空白 extracted_text = match_result.group(1).strip() print(extracted_text)
这里的(?!.*<document>)是关键,它会检查当前<document>之后再也没有其他<document>标签了,这样就精准定位到了那个有闭合标签的有效起始标签。
方法二:用字符串分割(更直观易读)
如果觉得正则有点绕,用字符串分割的方法更简单,毕竟你也说了不会有嵌套标签:
with open('data.txt', 'r') as f: text = f.read() # 按<document>分割文本,取最后一段(也就是最后一个<document>后面的内容) after_last_document = text.split("<document>")[-1] # 再按</document>分割,取前面的部分就是我们要的内容 extracted_text = after_last_document.split("</document>")[0].strip() print(extracted_text)
这个思路很直接:先把文本切成以<document>为分隔的片段,最后一段肯定是从最后一个<document>开始的内容,再把这段里</document>之前的部分拿出来就好。
为啥你之前的正则会失效呢?因为你用的.*?是非贪婪匹配,但它还是会从第一个<document>开始匹配,直到找到第一个</document>,所以会把中间额外的<document>和内容都包含进去。上面两种方法都能完美解决这个问题,选你觉得顺手的就行~
备注:内容来源于stack exchange,提问作者nohardfeelings
相关产品推荐
相关产品推荐

