python正则表达式

文章目录

      • 一、正则表达式概念
      • 二、正则表达式re模块
      • 三、正则表达式语法
        • 3.1 单字符匹配
        • 3.2 多字符匹配
        • 3.3 边界匹配
        • 3.4 分组匹配
      • 四、re模块其他方法
      • 五、正则表达式练习

一、正则表达式概念

1.使用单个字符串来描述匹配一系列符合其语法规则的字符串

2.是对字符串操作的一种逻辑公式

3.处理文本和数据

4.正则表达式过程:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功、否则匹配失败。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time    : 2019/9/17 13:38
@Author  : 我是天才很好
@Blog    : https://blog.csdn.net/weixin_43593330
@Email   : [email protected]
@File    : test1.py
@Software: PyCharm
"""
def find_start_imooc(fname):
    '''
    找到imooc开头的语句
    :param fname: 
    :return: 
    '''
    f = open(fname)
    for line in f:
        if line.startswith('imooc'):
            print(line)

def find_in_imooc(fname):
    '''
    找到imooc开头和结尾的语句
    :param fname: 
    :return: 
    '''
    f = open(fname)
    for line in f:
        if line.startswith('imooc')\
            and line.endswith('imooc\n'):  # and line[:,-1].endswith('imooc'):
            print(line)


if __name__ == "__main__":
    # find_start_imooc('imooc.txt')
    find_in_imooc('imooc.txt')

二、正则表达式re模块

# 导入re模块
import re  

# 生成pattern对象
pa = re.compile(r'imooc')  # 匹配的字符
# 生成match对象
ma = pa.match('imooc.com') # 被匹配的字符

print(ma.group()) # 返回匹配字符串或元组  ==>imooc   
print(ma.span())  # 被匹配字符串所在索引位置  ==>(0,5)                
print(ma.string)  # 返回被匹配字符串  ==>'imooc.com'                
print(ma.re)  # 返回匹配实例
print(ma.groups())  # 返回一个元组  pa = re.compile(r'(imooc)')  
pa = re.compile(r'(imooc)',re.I)   # 匹配忽略大小写
pa=re.compile(r'imooc',re.I)  # re.I的用法是忽略匹配字符串中的大小写
ma=pa.match(str1)  # 生成pa.match的实例对象
这两步等价于 ma = re.match(r'imooc',str1)

注意:
对于程序,如果需要做大量的正则匹配,而正则表达式只有一个,尽量避开直接使用re.match(关键字,被匹配串)这种方法。

三、正则表达式语法

3.1 单字符匹配

python正则表达式_第1张图片

  .    匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
[...]  匹配字符集 
 \d    匹配一个数字字符。等价于 [0-9]。
 \D    匹配一个非数字字符。等价于 [^0-9]。
 \s    匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
 \S    匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
 \w    匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'

3.2 多字符匹配

python正则表达式_第2张图片

     *       匹配前一个字符0次或者无限次
     +       匹配前一个字符1次或者无限次
     ?       匹配前一个字符0次或者1{m}/{m,n}    匹配前一个字符m次或者n次
*/+/??   匹配模式变为非贪婪(尽可能少匹配字符)
# [A-Z][a-z]* Adasdas   * = 0到无穷大
ma = re.match(r'[A-Z][a-z]*','Afsdsdf')

# [_a-zA-z]+[_\w]*      + = 1到无穷大
ma = re.match(r'[_a-zA-z]+[_\w]*','_ht11')

# [1-9]?[0-9]           ? = 0到1
ma = re.match(r'[1-9]?[0-9]','87')

3.3 边界匹配

python正则表达式_第3张图片

^         匹配字符串开头

$         匹配字符串结尾

\A/\Z     指定的字符串必须出现在开头/结尾

3.4 分组匹配

python正则表达式_第4张图片

   |          匹配左右任意一个表达式

 (ab)        括号中表达式作为一个分组

\<number>     引用编号为num的分组匹配到的字符串

(?P<name>)  分组起一个别名

(?P=name)   引用别名为name的分组匹配字符串

四、re模块其他方法

1、search(pattern,string,flags=0)
在一个字符串中查找匹配

2、findall(pattern,string,flags=0)
找到匹配,返回所以匹配部分的列表

3、sub(patten,repl,string,count=0,flags=0)
将字符串中匹配正则表达式部分替换为其他值
使用sub方法后会返回一个新的字符串 原字符串不变

4、split(patten,repl,string,count=0,flags=0)
根据匹配分割字符串,返回分割字符串组成的列表

五、正则表达式练习

课程编译环境: python 2.7

简单爬取网页步骤:

​ 1)分析网页元素

​ 2)使用urllib2打开链接

​ 3)读取链接文本

​ 4)使用re匹配出期望文本内容并分条存入list

# 爬取网站图片过程:
import urllib2  # 导入urllib2包
import re

req = urllib2.urlopen('http://www.XXXX.com')  # 对网页发出请求
buf = req.read() # 将网页内容读取到buf缓存中
urllist = re.findall(r'http:.+\.jpg',buf) # 获取图片地址列表
i = 0
for url in listurl:
    f = open(str(i)+'.jpg', 'w')
    req = urllib2.urlopen(url)
	buf = req.read()
    f.write(buf)
    i+=1

你可能感兴趣的:(python)