当前位置:

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

访客 2024-01-05 1215 0

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

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

方法介绍:

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

运行结果:

第一个标签第二个标签

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

importretext='<docid="6899385"url="https://en.wikipedia.org/wiki?curid=6899385"title="Omanbullheadshark">\nOman\n\nTheOmanbullheadshark,"Heterodontusomanensis".\n\n\n</doc>'#使用正则表达式提取属性值doc_pattern=re.compile(r'<docid="(\d)"url="(.)"title="(.)">')match=doc_pattern.search(text)ifmatch: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:6899385url:https://en.wikipedia.org/wiki?curid=6899385title:Omanbullheadshark

注意:

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

3、匹配多个文本属性值

importre#定义一个用于匹配属性的正则表达式pattern=r'<docid="(\d)"url="(.*?)"title="(.*?)">'#读取文本文件,将每个文档作为一个字符串处理withopen('docs.txt','r')asfile:docs=file.read().split('</doc>')fordocindocs:#在每个文档中查找属性match=re.search(pattern,doc,re.DOTALL)ifmatch:doc_id=match.group(1)url=match.group(2)title=match.group(3)print(f"docid:{doc_id},url:{url},title:{title}")

发表评论

  • 评论列表
还没有人评论,快来抢沙发吧~