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

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 后,就可以直接书写正则表达式,更加方便。
  • (.*?)(.+?)的区别在于, *匹配零次或多次,+匹配一次或多次。因此,(.+?)匹配至少一个字符,而(. *?)可以匹配零个字符。