使用正则表达式提取标签内容和属性

1、提取标签内容:<doc>内容</doc>

import re

text = "文本中的<doc>第一个标签</doc>和<doc>第二个标签</doc>"
matches = re.findall('<doc.*?>(.*?)</doc>', text, re.DOTALL)

for match in matches:
    print(match)

方法介绍:

  • findall() 方法会返回一个列表,列表中每个元素是匹配到的标签中间的内容。
  • <doc.*?> 表示匹配以 < doc > 开头的标签,.*? 表示匹配中间任意字符(非贪婪模式,>表示匹配标签的结束符号>
  • (.*?) 表示匹配中间的任意字符(非贪婪模式)并将其作为一个分组,这个分组的内容最终将被返回
  • </ doc> 表示匹配以 </ doc> 结尾的标签
  • re.DOTALL 参数表示将.元字符的匹配范围扩展到包括换行符\n在内的任意字符。这样可以确保正则表达式能够匹配多行文本。

运行结果:

第一个标签
第二个标签

2、提取标签属性:提取给定字符串中的 id、url 和 title 等属性值
<doc id="6" url="https://wiki?curid=6" title="Oman"> </doc>

import re

text = '<doc id="6899385" url="https://en.wikipedia.org/wiki?curid=6899385" title="Oman bullhead shark">\nOman\n\nThe Oman bullhead shark, "Heterodontus omanensis". \n\n\n</doc>'

# 使用正则表达式提取属性值
doc_pattern = re.compile(r'<doc id="(\d+)" url="(.+)" title="(.+)">')
match = doc_pattern.search(text)

if match:
    doc_id = match.group(1)
    url = match.group(2)
    title = match.group(3)
    
    print("doc_id:", doc_id)
    print("url:", url)
    print("title:", title)

详细介绍:

  • re.compile() 是 Python 中正则表达式模块 re 中的一个函数,用于将正则表达式的字符串形式编译成正则表达式对象,可以在多次使用同一正则表达式时提高效率。
  • (\d+): 匹配一个或多个数字,这里表示文章的 ID 号,因为在 标签中的 id 属性是一个数字。
  • 第一个 (.+?): 匹配任意数量的字符,这里表示文章的 URL,因为在 标签中的 url 属性是一个 URL 地址,包含多个字符。
  • 第二个 (.+?): 匹配任意数量的字符,这里表示文章的标题,因为在 标签中的 title 属性是一个字符串,包含多个字符。
  • 使用了 () 来标记需要提取的部分,这些部分可以通过在 re.search() 函数中使用 .group() 方法来提取出来。

运行结果:

doc_id: 6899385
url: https://en.wikipedia.org/wiki?curid=6899385
title: Oman bullhead shark

注意:

  • 上面两个正则表达式中有的加了r,有的没加加上 r。r表示这是一个 raw string,不需要对反斜杠进行转义。而后者是一个普通的字符串,需要对反斜杠进行转义,例如 \d 表示匹配一个数字。在正则表达式中经常会用到反斜杠,如果不加 r 就需要对每个反斜杠进行转义,非常繁琐。而加上 r 后,就可以直接书写正则表达式,更加方便。
  • (.*?)(.+?)的区别在于, *匹配零次或多次,+匹配一次或多次。因此,(.+?)匹配至少一个字符,而(. *?)可以匹配零个字符。

3、匹配多个文本属性值

import re

# 定义一个用于匹配属性的正则表达式
pattern = r'<doc id="(\d+)" url="(.*?)" title="(.*?)">'

# 读取文本文件,将每个文档作为一个字符串处理
with open('docs.txt', 'r') as file:
    docs = file.read().split('</doc>')

    for doc in docs:
        # 在每个文档中查找属性
        match = re.search(pattern, doc, re.DOTALL)
        if match:
            doc_id = match.group(1)
            url = match.group(2)
            title = match.group(3)
            print(f"doc id: {doc_id}, url: {url}, title: {title}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值