Python使用正则表明式获取网页中所须求的新闻,正则表示式及re模块

ca88会员登录中心

选取正则表达式的多少个步骤:

那是Python编程火速上手的第8章节,对于regex,我想说:他或然是文本处理最棒的利器了。即便它用了大气的元字符来相称,各类转义也让其代码晦涩难懂。但并不影响她的光华,尽管你不编码,也理应学学regex。
本书壹开头在不选取regex的事态下行使Python代码剖判文本开掘代码很冗余。然后利用regex,区区几行便消除难题。代码逻辑如下:
纵然如此在Python 中接纳正则表明式有多少个步骤,但每一步都格外轻松。
一.用import re 导入正则表明式模块。
二.用re.compile()函数创设2个Regex 对象(记得使用原始字符串)。
三.向Regex 对象的search()方法传入想搜寻的字符串。它回到三个Match
对象。
四.调用Match 对象的group()方法,重返实际相配文本的字符串。
那就讲了Python用到的compile,search,group,groups,findall,sub方法。
compile参数:re.IGNORECASE re.DOTALL re.VERBOSE
接下来引出regex语法:
,?,+,(),|,{},非贪心相配?,字符分类\d,\D,\w,\W,\s,\S,[],
^,$,.,.
,分组\1,\2,\3
此间引出的主题材料是:

python中的全部正则表明式函数都在re模块中。import re导入该模块。

壹、用import re 导入正则表明式模块;

  1. 转义字符
  2. 元字符
  3. []内外的转义情形

1,创造正则表达式对象

想re.compile()传入贰个字符串值,表示正则表明式,它将赶回2个Regex方式对象。

开创多少个相称手提式有线电话机号的(\d表示二个数字字符)

mphone_regex = re.compile(r’\d\d\d-\d\d\d\d-\d\d\d\’)

二、用re.compile()函数创立3个Regex对象;

2,相配正则表明式

regex对象的search()方法找寻传入的字符串,搜索该正则表明式的享有相称。假若字符串中绝非找到该正则表明式格局,search()方法重回None。即便找到该方式,search()方法再次回到三个Match对象,

Match对象有二个group()方法,它回到被搜索字符串中实际上相配的公文,如下

import re
mphone_regex = re.compile(r'\d\d\d-\d\d\d\d-\d\d\d\d')
mo = mphone_regex.search('My mobile Phone Number is 133-1111-1111.')
print('number is:%s'%mo.group())

输出:
number is:133-1111-1111

瞩目:字符串中的\n,\t分表表示换行、制表符,\是个转义字符,\\才表示三个\。借使在字符串的先头加上r,能够将该字符串标志为原始字符串,它不包含转移字符。

其顺序为:

  • import re 导入re模块
  • 用re.compile()创设1个Regex对象,最佳带上r
  • 想Regex对象的search()方法传入想搜寻的字符串。它回到多个Match对象
  • 调用Match对象的group()方法,重返实际相称文本的字符串

上边的也能够那样写:

import re
mo = re.search(r'\d{3}-\d{4}-\d{4}','My mobile Phone Number is 133-1111-1111')
print('number is:%s'%mo.group())

3、用Regex对象的search()或findall()方法,传入想要查找的字符串,再次回到四个Match对象;

3,用括号分组

倘使自身只想要手提式有线电话机号的前贰位怎么办?

import re
mo = re.search(r'(\d{3})-(\d{4}-\d{4})',r'My mobile Phone Number is 133-1111-1111') #用()将正则表达式分成两组

print('number is:%s'%mo.group())     #group()没有参数或者参数0表示整个匹配的文本
print('number is:%s'%mo.group(0))
print('number is:%s'%mo.group(1))   #1表示第一对括号匹配的内容
print('number is:%s'%mo.group(2))   #1表示第一对括号匹配的

输出:

number is:133-1111-1111
number is:133-1111-1111
number is:133
number is:1111-1111

假定要一遍获得具备的分组,就使用groups()。

import re
mo = re.search(r'(\d{3})-(\d{4}-\d{4})',r'My mobile Phone Number is 133-1111-1111') #用()将正则表达式分成两组
print(mo.groups())  #groups返回包含多个值的元组
first,last = mo.groups()
print(first)
print(last)
输出:
('133', '1111-1111')
133
1111-1111

ca88会员登录中心,那就是说难题来了,既然()在正则表明式中有例外的意思,那么怎样合作文本中的()呢?使用\开始展览转变,\(内容\)

import re
mo = re.search(r'(\(\d{3}\))-(\d{4}-\d{4})',r'My mobile Phone Number is (133)-1111-1111') #用()将正则表达式分成两组
print(mo.group())
print(mo.group(1))

输出:
(133)-1111-1111
(133)

肆、调用Match对象的group()方法,再次来到相配到的字符串。

肆,使用管道相称八个分组

比如laowang和xiaozhang都出现在被搜索的字符串中,第三回面世的分外文本,将用作Match对象回来。

import re
name = re.search(r'laowang|xiaozhang','We team include laowang and xiaozhang.')
print(name.group()) #第一个先匹配到谁,谁将作为Match对象返回

输出:
laowang

运用管道来协作多个格局中的三个

import re
name = re.search(r'lao(wang|zhang|liu|luo|cc)','We team include laoliu,laoluo,laowang and laozhang.')
print(name.group())
print(name.group(1))
输出:
laoliu
liu

name.group()再次回到完全协作的文书‘laoliu’,name.grop(一)只回去首个括号分组中相称到的文本‘liu’。能够接纳管道和()组合去相称。其它要是匹配真正的|,须要转意\|

import re
name = re.search(r'lao(wang|zhang|liu|luo|cc)-(er|san|si|wu)','We team include laoliu-qq,laoluo-er,laowang-sfs and laozhang.')
print(name.group())
print(name.group(1))
print(name.group(2))

输出:
laoluo-er
luo
er

在交互式遭逢中简易尝试一下,查询字符串中的固话:

5,用问号完结可选相配

临时,相相称的形式是可选的。正是说,无论这段文本存不存在,正则表明式都会存在。

>>> phone = re.search(r'(\d{3}-)?\d{4}-\d{4}','phone is 1234-1234')
>>> phone.group()
'1234-1234'
>>> phone = re.search(r'(\d{3}-)?\d{4}-\d{4}','phone is 021-1234-1234')
>>> phone.group()
'021-1234-1234'
>>> 

(\d{叁}-)?,()里的内容可选,有则非常,未有则不包容。也得以这么想相配这一个问号前的分组0次仍旧1次。

如果急需特别真正的?,需求\?

 import re
 text = '小明家的固话是0755-123456,而小丽家的固话时0789-654321,小王家的电话是123456789'#用于检测的字符串
 ph_re = re.compile(r'\d{4}?-\d+') #创建Regex对象,匹配几种电话的方式,\d表示0-9的数字,{4}表示前面的匹配4次,?表示可选,+表示出现1次或多次。
 matchs1 = ph_re.findall(text) #findall()表示查找所有匹配项,返回一个字符串
 matchs2 = ph_re.search(text)#search(),查找第一次匹配的文本,返回一个对象。
 print(matchs1)
 print(matchs2)
 matchs2.group()

6,用星号相称0次或频仍

和?差不多,只不过*前的分组既能够相配0次,也得以相称放肆次。

>>> name = re.search(r'(too)*good','you are tootootoogood!')
>>> name.group()
'tootootoogood'
>>> name = re.search(r'(too)*good','you are good!')
>>> name.group()
'good'
>>> 

回到的结果,是那般的:

七,用加号相配一遍或频繁

跟*采用同壹,只不过*前的分组能够相配0次。不过+前的分组至少相称二回

findall()方法重回的是三个字符串,能够间接打字与印刷出来。而search()方法再次回到的是3个目的,所以打印出来的是是如图的第一行。

8,用花括号相称特定次数

壹经要二个分组重复特定次数,就在正则表明式该分组的前面,写上花括号,并在{}里面写上需求重新的次数

如(too){三}表示将卓殊三次too,(\d){一,4},表示格外数字二个,一个,三个或伍个数字。而(\d){三,}表示特别叁个或更加多的数字,(\d){,伍}表示相配0到四个数字。

>>> name.group()
'tootoogood'
>>> name = re.search(r'(too){3}good','you are tootootoogood!')
>>> name.group()
'tootootoogood'
>>> num = re.search(r'(\d){,4}-a','afafa afaf a12334 43af -a')
>>> num.group()
'-a'
>>> 

调用group(),对象回来相配的结果。

九,贪婪相配与非贪婪相配

如下边:,相称一-五个too,还是能回去toogood,tootoogood,为啥会是tootootoogood呢?

>>> name = re.search(r'(too){1,4}good','you are tootootoogood!')
>>> name.group()
'tootootoogood'

Python正则表达式暗中同意是“贪婪”的,那代表在多义的图景下,它们会诚心诚意相称最长的字符串。花括号的”非贪婪”相称尽大概最短的字符串,在花括号前面加个?,即{}?

>>> name = re.search(r'd(o){1,5}','you are dooooo!')
>>> name.group()
'dooooo'
>>> name = re.search(r'd(o){1,5}?','you are dooooo!')
>>> name.group()
'do'
>>> 

那一个还未完全搞明白,待补充。。。。。。

10,findall()方法

search()只会再次回到第二个分外到的文书,且再次回到的是一个Match对象,要求使用group()也许groups()查看

findall()不是回来八个Match对象,而是重返二个饱含全数匹配项的列表

  • 假设调用在一个尚无分组的正则表明式上,findall()将赶回八个相配字符串的列表
  • 若果调用在一个有分组的正则表明式上,findall()将回到二个饱含字符串的元组构成的列表(种种分组对应元组中的多个字符串)(分组外的-不会回来,如上面例子)

    phone = re.findall(r’\d{3}-\d{3}-\d{3}’,’number is 123-456-789and111-111-111 and 123-456-789′)
    phone
    [‘123-456-789’, ‘111-111-111’, ‘123-456-789′]
    phone = re.findall(r'(\d{3})-(\d{3}-\d{3})’,’number is 123-456-789and111-111-111 and 123-456-789′)
    phone
    [(‘123’, ‘456-789’), (‘111’, ‘111-111’), (‘123’, ‘456-789’)]

11,不区分轻重缓急写的匹配

动用re.I 或许re.IGNORECASE作为正在表明式的第三个参数

>>> name = re.search(r'jack,mike','there are some boys:Jack,Mike',re.I)
>>> name.group()
'Jack,Mike'
>>> 

末段,小王的电话机之所以未有相称到,是因为’-‘未有展开可选即在其后拉长‘?’。

 1二,插入字符和新币字符

能够在正则表明式的启幕处选取插入符号(^),注解合作必须产生在被寻觅文本开始处。类似的,能够在正则表明式的最后加上日元符号($),表示该字符串必须以这几个正则表明式的格局截至。可以同期使用^和$,申明整个字符串必须协作该形式。

>>> name
[]
>>> name = re.findall(r'^hel','Hello World !',re.I)
>>> name
['Hel']
>>> 

>>> name = re.findall(r'world !$','Hello World !',re.I)
>>> name
['World !']

下边实行二个小的试验,获取有个别网页中颇具的http/https网站,并企图有微微个。

一叁,通配字符

在正则表达式中,.(句点)字符称为“通配符”。它卓殊除了换行符之外的持有字符。

>>> at = re.findall(r'.at','hat,cat,sat,mat')
>>> at
['hat', 'cat', 'sat', 'mat']
>>> 

句点字符只特出2个字符。要协作真正的句点,要转意,\. 。

率先是获得HTML文件。这里要用到requests模块。

14,用点星相配全体字符

句点表示除换行外的具有单个字符,星号字符表示“后面字符现身0次或频仍”。

>>> name = re.search(r'ab.*gh','123abcdefghijk')
>>> name
>>> name.group()
'abcdefgh'
>>> 

点星号使用贪婪情势和非贪婪形式:暗许是贪心匹配,使用非贪婪相配,使用.*?
  

>>> book = re.search('<.*>','<<Python>>,<<shell>>')
>>> book.group()
'<<Python>>,<<shell>>'
>>> book = re.search('<.*?>','<<Python>>,<<shell>>')
>>> book.group()
'<<Python>'
>>> 
 # -*- coding: utf-8 -*-
 import requests
 import re
 def get_html(url):
  res = requests.get(url)
  res.encoding = 'utf-8'
  html = res.text
  return html

15,用句点字符相配换行符

 点星将匹配除换行外的享有字符。通过传播re.DATALL参数,能够让句点字符相称全部字符,也包含换行。

import re
txt = """
every night in my dreams
i see you, i feel you
that is how i know you go on\nfar across the distance
"""
test1 = re.search(r'in my.*far',txt,re.DOTALL)
test2 = re.search(r'in my.*far',txt,)
print(test1.group())

输出:
in my dreams
i see you, i feel you
that is how i know you go on
far

这里get_html函数重回的,其实就像上边例子中的text,用来同盟的文本。

16,创建友好的字符分类

有时你想相称壹组字符,然则\d,\w,\s相配的太宽广了,你能够用方括号定义紫的字符分类。譬喻字符分类[aeiouAEIOU]将相配全部原音字符。

>>> re.findall(r'[aeiouAEIOU]','I am lao cui')
['I', 'a', 'a', 'o', 'u', 'i']
>>> 

也足以选用短横线表示字母或数字的界定。比如,字符分类[a-zA-Z0-9]将特别全体大小写字母和数字。

请留心,在方括号内,普通的正则表明式符号不会被分解,那表示,你无需前边加上\转义,假设你须要同盟数字和五个*,直接[0-9*]即可,不需要[0-9\*]。

经过在方括号内第二个岗位加上1个^,就足以博得‘非字符类’。非字符类将相配不在那一个字符类中的全部字符。如下:

>>> re.findall(r'[^aeiouAEIOU]','I am lao cui')
[' ', 'm', ' ', 'l', ' ', 'c']
>>> 

一7,用sub()方法替换字符串

正则表明式不止能找到文本,还是能够用新的公文替换掉那一个情势,Regex的sub()方法必要传入四个参数,第三个参数是1个字符串,用来替换相配到的字符串。

import re
num = re.compile(r'\d{3}')
test = num.sub('***','123-456-abc')
print(test)

输出:
***-***-abc

也得以这么:

test = re.sub(r'\d{3}','***','123-456-abc')
print(test)

然后,创设正则表明式:

1八,使用多少个参数

暗中认可只可以接受贰个参数,能够动用管道符|

txt = """
Every night In my dreams
I see you, i feel you
that is how i know you go on\nfar across the distance
"""
test1 = re.search(r'in my.*far',txt,re.DOTALL|re.I)
print(test1.group())
输出:
In my dreams
I see you, i feel you
that is how i know you go on
far

既不区分轻重缓急写,又能相称换。

def get_addr(response):
  addr_regex = re.compile(r'''(
   (http://|https://)?  #http/https
   (www)?
   (\.[a-z1-9A-Z]+)
   (\.com|\.cn)
   )''',re.VERBOSE)#匹配网址,
  matchs = []
  for groups in addr_regex.findall(response):
   matchs.append(groups[0])
  if len(matchs) == 0:
   print('没有网址')  
  return matchs

1玖,re.VE智跑SONOS参数,常用来保管复杂的正则表明式

要是要同盟1个目迷五色的公文,会供给二个既长又费解的正则表明式,能够使用re.VEOdysseyLibratone参数来忽略正则表明式中字符串中的空白符和注释。

import re
phoneregex = re.compile(r"""(
    (\d{3}|\(\d{3}\))?      #匹配区号可选,123或者(123),注意管道符,和后面括号的转义
    (\s|-|\.)?          #可选连接符,空格或者-或者
    (\d{4})         #前4位号码
    (\s|-|\.)?          #可选连接符,空格或者-或者
    (\d{4})         #后4为号码
    (\s*(ext|x|etx\.)\s*(\d{2,5}))?  #可选的分机号,包括任意的空格接着ext或x或etx.再接任意空格,2到5个数字
)""",re.VERBOSE
)

num = phoneregex.findall('38637788,3863-1234- x23,010-1234-2345 etx.145')
print(num)
输出:

[(‘38637788’, ”, ”, ‘3863’, ”, ‘7788’, ”, ”, ”), (‘3863-1234’,
”, ”, ‘3863’, ‘-‘, ‘1234’, ”, ”, ”), (‘010-1234-2345 etx.145’,
‘010’, ‘-‘, ‘1234’, ‘-‘, ‘2345’, ‘ etx.145’, ‘etx.’, ‘145’)]

瞩目:如若外面不加括号,那么列表中种种元组的首先个就不是总体的电话号了,就是逐一分组。仿效下边包车型地铁()分组,管道和findall()。

 

这里向re.compile(),传入变量re.VE凯雷德SONOS,作为第三个参数,能够将正则表明式放在多行,并打开疏解,如上。

回到二个matchs列表对象。

再来个运维函数。

 def start():
  url = 'http://news.163.com/18/0127/18/D966K4CO0001899N.html'
  a = get_html(url)
  b = get_addr(a)
  print('\n'.join(b))
  print(str(len(b)))
  print('ok')
if __name__ == '__main__':
  start()

此间流传的url是自己随意找的一个资源信息链接。

接下来调用get_html()get_addr(),就获得了想要的东西。str(len(b)),为计算的数额。

测试的结果是类似那样的:

这里就好像赢得一些U大切诺基L,没什么卵用。。。但是,要是构成后边的询问新闻列表的办法,获取批量url,

而创制的正则是xxx.jpg,然后调用os模块,os.mkdir(folder)、os.chdir(folder),将收获到的卓殊结果写入文件,放入有个别文件夹。

这便是说就足以兑现,从有些网址上批量获取jpg图片,然后存入某些文件夹的爬虫效能。实地测量,可行!

总结

以上所述是笔者给大家介绍的Python使用正则获取网页中所要求的音信,希望对我们有着扶助,固然大家有别的疑问请给自身留言,作者会及时还原大家的。在此也特别多谢大家对台本之家网址的协助!

您或然感兴趣的稿子:

  • python 正则表达式 re.sub &
    re.subn
  • 正则表达式re.sub替换不完全的主题材料及全体化解方案
  • Python正则表明式中的re.S的效能详解

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图