Allen 2020-06-13 16:22:10 4141 0 0 0 0

Python爬虫基础-正则表达式

# 正则表达式基础
  基础1:
    全局匹配函数使用格式 re.compile(正则表达式).findall(源字符串)

    普通字符 正常匹配
    #\n   匹配换行符
    \t    匹配制表符
    \w    匹配字母、数字、下划线
    \W    匹配除字母、数字、下划线
    \d    匹配十进制数字
    \D    匹配除十进制数字
    \s    匹配空白字符
    \S    匹配除空白字符
    [ab89x] 原子表,匹配ab89x中任意一个
    [^ab89x] 原子表,匹配除ab89x以外的任意一个字符

    实例1:
      源字符串:"aliyunedu"
      正则表达式:"yu"
      输出:yu
      >>> import re
      >>> a="aliyunedu"
      >>> pat="yu"
      >>> re.compile("yu").findall(a)
      ['yu']
      ...
>>> a="aliyu89787nedu"
>>> pat="\w\d\w\d\d\w"
>>> re.compile(pat).findall(a)
['u89787']
...
>>> a="aliyu89787nedu"
>>> pat="\w\d[nedu]\w"
>>> re.compile(pat).findall(a)
['87ne']
...
  基础2:
    .  匹配除换行外任意一个字符
    ^  匹配开始位置(不在原子表中时,在原子表中表示:非)
    $  匹配结束位置
    *  前一个字符出现0\1\多次
    ?  前一个字符出现0\1次
    +  前一个字符出现1\多次
    {n}  前一个字符恰好出现n次,没有最多限制
    {n,}  前一个字符至少出现n次
    {n,m}  前一个字符至少出现n次,至多m次
    |  模式选择符:或
    ()  模式单元,通俗来说就是:想提取出什么内容,就在正则中用小括号将其括起来
    。。。
    实例2:
    源字符串:"aliyunnnji87362387aoyubaidu"
    正则表达式:"ali..."
    结果:aliyun
>>> a="aliyunnnji87362387aoyubaidu"
>>> pat="ali..."
>>> re.compile(pat).findall(a)
['aliyun']
.
>>> pat="^li..."
>>> re.compile(pat).findall(a)

>>> pat="^ali..."
>>> re.compile(pat).findall(a)
['aliyun']
.
>>> pat="bai..$"
>>> re.compile(pat).findall(a)
['baidu']
.
>>> pat="ali.*" #*号前的点出现多次
>>> re.compile(pat).findall(a)
['aliyunnnji87362387aoyubaidu']
# tips:默念贪婪,即默认尽可能多地进行匹配
.
>>> pat="aliyun+" #前一个字符出现1次多次
>>> re.compile(pat).findall(a)
['aliyunnn']
.
>>> pat="aliyun?"
>>> re.compile(pat).findall(a)
['aliyun']
.
>>> pat="yun{1,2}" # 前一个字符出现至少一次,最多2次
>>> re.compile(pat).findall(a)
['yunn']
.
>>> pat="^al(i..)."  #关注的是()里的,^al表示能匹配,
>>> re.compile(pat).findall(a)
['iyu']
...基础3:
     贪婪模式:尽可能多地匹配
     懒惰模式:尽可能少地匹配,精准模式
     默认贪婪模式
     如果出现如下组合,则代表懒惰模式
     *?
     +?
     实例3:
     源字符串:"poytphonyhjskjsa"
     正则表达式:"p.*y"
     >>> a="poytphonyhjskjsa"
     >>> pat="p.*y"
     >>> re.compile(pat).findall(a)
     ['poythony'] #默认贪婪模式
     .     
     >>> pat="p.*?y"
     >>> re.compile(pat).findall(a)
     ['poy', 'phony'] #懒惰模式,精准匹配
...基础4:
    模式修正符:在不改变正则表达式的情况下,通过模式修正符使匹配结果发生更改
    re.S  让.也可以匹配多行
    re.I  让匹配时忽略大小写 
    实例4:
    a="Python"
    pat="pyt"
    >>> a="Python"
>>> pat="pyt"
>>> re.compile(pat).findall(a)
[]  # 因为大小写不一致,所以返回空
.
>>> re.compile(pat,re.I).findall(a)
['Pyt'] # 加入模式修正符,可以匹配
.
>>> a="""我是阿里云大学
欢迎来学习
Python网络爬虫课程
"""
>>> print(a)
我是阿里云大学
欢迎来学习
Python网络爬虫课程

>>> pat="阿里.*?Python"
>>> re.compile(pat).findall(a)
[]
>>> re.compile(pat,re.S).findall(a)
['阿里云大学\n欢迎来学习\nPython'] #匹配多行,忽略换行

+++39'19"
除了正则表达式之外,还有一-些非常好用的信息筛选的工具,比如XPath表达式、Beautiful
Soup等等,当然,我们不可能也不需要都进行掌握,在此,我们讲解一下XPath表达式。
/  逐层提取
text()  提取标签下面的文本
//标签名**  提取所有名为**的标签
//标签名[@属性='属性



Tag: Python 爬虫 正则表达式
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[Pyhon爬虫]   ·   返回顶部