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