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}")