python 正则表达是常用语法理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28711703/article/details/79825004
#coding=utf-8
#文件操作
import os
#__file__代表的是当前文件完整路径
#os.path.dirname(__file__) 返回的是当前文件所在目录
dir_path=os.path.dirname(__file__)
file_path=os.path.join(dir_path,"xiaolu.html")
#print(file_path)



#爬虫
#在python3.3里面,用urllib.request代替urllib2
'''

import urllib2
file_html=urllib2.urlopen("https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E8%8A%9D%E9%BA%BB%E8%A1%97%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8/22280165?fr=aladdin").read().decode("utf8")
print(file_html)
'''
import urllib.request
#获取Html文件
file_html=urllib.request.urlopen("https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E8%8A%9D%E9%BA%BB%E8%A1%97%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8/22280165?fr=aladdin").read().decode("utf8")

import  re
#正则表达式的相关语法 http://www.runoob.com/python/python-reg-expressions.html
#print(re.match("www","www.baidu.com").span())
#span 表示从开始位置匹配



#re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
#re.match只能从字符串的开始进行匹配,如果开始不能完成匹配,那么函数就返回none
#str="Cats are smarter than dogs"
#object=re.match(r'(.*) are (.*?) .*',str,re.M|re.I)
#字符串前面加上r代表对是字符串不进行转译
#re.I  不区分大小写 ;re.M 进行多行匹配 形象^和$符号的作用
# if(object):
    # print(object.group())#返回整个句子
    # print(object.group(1))#返回匹配的第一个括号内容
    # print(object.group(2))#返回匹配的第一个括号内容
# else:
    # print("no")
'''
在第二个括号加上问号的作用
如果加入问号,输入的结果是
    Cats are smarter than dogs
    Cats
    smarter
如果不加问号,输出的结果是
    Cats are smarter than dogs
    Cats
    smarter than

解析:re?代表的是非贪婪式匹配,所以加上?后,当匹配到第一个空格时就停止匹配,但是当没有空格时,匹配到
最后一个空格才停止匹配
'''


#re.search 扫描整个字符串并返回第一个成功的匹配。匹配成功re.search方法返回一个匹配的对象,否则返回None。
# object=re.search(r'(.*) are (.*?) .*',str)
# if(object):
    # print(object.group())
    # #group()函数不是返回的整个str,而是返回能匹配上的真个句子
    # print(object.group(1))
    # print(object.group(2))
# else:
    # print("no")

'''
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

'''

#
'''
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, count=0, flags=0)

参数:

    pattern : 正则中的模式字符串。
    repl : 替换的字符串,也可为一个函数。
    string : 要被查找替换的原始字符串。
    count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
'''

# phone ="157-3517-0529 #这是小路的电话"
# num=re.sub(r'#.*$','',phone)
# print("小路的电话是:"+num)
# num=re.sub('\D','',num)
# #'\D'代表的是匹配非数字
# print("小路的电话是:"+num)


#repl 参数可以是一个函数
# def double(matched):
    # value=int(matched.group('value'))
    # #print(value)
    # return str(value*2)
# #之前str error,TypeError: 'str' object is not callable
# #因为在之前我定义了一个str字符串,所以在调用str()函数进行转换时,就出现该函数不能调用的错误
# s = 'A23G4HFD567'
# print(re.sub('(?P<value>\d+)', double, s))
#?P<value> 代表的是为group 分组添加一个分组名
#为group命令,全要在前面添加一个问号,如果问号没有添加,就没有命名成group
#至于有+号,是当匹配到多个数字字符串时,将整个字符串数字*2,不是将单个数字字符*2


#re.compile
'''
re.compile(pattern[, flags])

参数:

    pattern : 一个字符串形式的正则表达式

    flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
        re.I 忽略大小写
        re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
        re.M 多行模式
        re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
        re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
        re.X 为了增加可读性,忽略空格和 # 后面的注释

'''




# pattern=re.compile(r'\d+');
# m=pattern.match('one12twothree34four');
# print(m)

# m=pattern.match('one12twothree34four',3,10);
# print(m.group())
# print(m.start(0))#匹配的起始位置
# print(m.end(0))#匹配的结束位置
# print(m.span(0))#返回的是一个元组,包含匹配的开始位置和结束位置


#findall
'''
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式为:

findall(string[, pos[, endpos]])

参数:

    string : 待匹配的字符串。
    pos : 可选参数,指定字符串的起始位置,默认为 0。
    endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。
'''

# pattern=re.compile(r'\d+')
# result1=pattern.findall('runoob 123 google 456')
# result2=pattern.findall('run88oob123google456')
# print(result1)
# print(result2)


#re.finditer
'''

Python 基础教程
Python 基础教程
Python 简介
Python 环境搭建
Python 中文编码
Python 基础语法
Python 变量类型
Python 运算符
Python 条件语句
Python 循环语句
Python While 循环语句
Python for 循环语句
Python 循环嵌套
Python break 语句
Python continue 语句
Python pass 语句
Python Number(数字)
Python 字符串
Python 列表(List)
Python 元组
Python 字典(Dictionary)
Python 日期和时间
Python 函数
Python 模块
Python 文件I/O
Python File 方法
Python 异常处理
Python OS 文件/目录方法
Python 内置函数

Python 高级教程
Python 面向对象
Python 正则表达式
Python CGI编程
Python MySQL
Python 网络编程
Python SMTP
Python 多线程
Python XML解析
Python GUI 编程(Tkinter)
Python2.x与3​​.x版本区别
Python IDE
Python JSON
Python 100例
Python 面向对象
Python CGI编程
Python 正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

re 模块使 Python 语言拥有全部的正则表达式功能。

compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

本章节主要介绍Python中常用的正则表达式处理函数。
re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

函数语法:

re.match(pattern, string, flags=0)

函数参数说明:
参数    描述
pattern    匹配的正则表达式
string    要匹配的字符串。
flags    标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

匹配成功re.match方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法    描述
group(num=0)    匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()    返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配

以上实例运行输出结果为:

(0, 3)
None

实例
#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs"
 
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

以上实例执行结果如下:

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)

函数参数说明:
参数    描述
pattern    匹配的正则表达式
string    要匹配的字符串。
flags    标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.search方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法    描述
group(num=0)    匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()    返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
print(re.search('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span())         # 不在起始位置匹配

以上实例运行输出结果为:

(0, 3)
(11, 14)

实例
#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs";
 
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
 
if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"
以上实例执行结果如下:

searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
实例
#!/usr/bin/python
import re
 
line = "Cats are smarter than dogs";
 
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
 
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
   print "search --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
以上实例运行结果如下:

No match!!
search --> matchObj.group() :  dogs

检索和替换

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

语法:

re.sub(pattern, repl, string, count=0, flags=0)

参数:

    pattern : 正则中的模式字符串。
    repl : 替换的字符串,也可为一个函数。
    string : 要被查找替换的原始字符串。
    count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
 
phone = "2004-959-559 # 这是一个国外电话号码"
 
# 删除字符串中的 Python注释
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num
 
# 删除非数字(-)的字符串
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num
以上实例执行结果如下:

电话号码是:  2004-959-559
电话号码是 :  2004959559

repl 参数是一个函数

以下实例中将字符串中的匹配的数字乘以 2:
实例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import re
 
# 将匹配的数字乘以 2
def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)
 
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))

执行输出结果为:

A46G8HFD1134

re.compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

语法格式为:

re.compile(pattern[, flags])

参数:

    pattern : 一个字符串形式的正则表达式

    flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
        re.I 忽略大小写
        re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
        re.M 多行模式
        re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
        re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
        re.X 为了增加可读性,忽略空格和 # 后面的注释

实例
实例
>>>import re
>>> pattern = re.compile(r'\d+')                    # 用于匹配至少一个数字
>>> m = pattern.match('one12twothree34four')        # 查找头部,没有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
>>> print m                                         # 返回一个 Match 对象
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0)   # 可省略 0
'12'
>>> m.start(0)   # 可省略 0
3
>>> m.end(0)     # 可省略 0
5
>>> m.span(0)    # 可省略 0
(3, 5)

在上面,当匹配成功时返回一个 Match 对象,其中:

    group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
    start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
    end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
    span([group]) 方法返回 (start(group), end(group))。

再看看一个例子:
实例
>>>import re
>>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写
>>> m = pattern.match('Hello World Wide Web')
>>> print m                               # 匹配成功,返回一个 Match 对象
<_sre.SRE_Match object at 0x10bea83e8>
>>> m.group(0)                            # 返回匹配成功的整个子串
'Hello World'
>>> m.span(0)                             # 返回匹配成功的整个子串的索引
(0, 11)
>>> m.group(1)                            # 返回第一个分组匹配成功的子串
'Hello'
>>> m.span(1)                             # 返回第一个分组匹配成功的子串的索引
(0, 5)
>>> m.group(2)                            # 返回第二个分组匹配成功的子串
'World'
>>> m.span(2)                             # 返回第二个分组匹配成功的子串
(6, 11)
>>> m.groups()                            # 等价于 (m.group(1), m.group(2), ...)
('Hello', 'World')
>>> m.group(3)                            # 不存在第三个分组
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group
findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

注意: match 和 search 是匹配一次 findall 匹配所有。

语法格式为:

findall(string[, pos[, endpos]])

参数:

    string : 待匹配的字符串。
    pos : 可选参数,指定字符串的起始位置,默认为 0。
    endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。

查找字符串中的所有数字:
实例
# -*- coding:UTF8 -*-
 
import re
 
pattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)
 
print(result1)
print(result2)

输出结果:

['123', '456']
['88', '12']

re.finditer

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.finditer(pattern, string, flags=0)

参数:
参数    描述
pattern    匹配的正则表达式
string    要匹配的字符串。
flags    标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
'''

# it =re.finditer(r'\d+',"12a32bc43jf3")
# print(it)
# for match in it:
    # print(match.group())
# #it b本质上返回的是一个\d+匹配成功的对象数组。该对象可以通过group返回匹配的内容


#re.spilt
'''
split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

re.split(pattern, string[, maxsplit=0, flags=0])

参数:
参数    描述
pattern    匹配的正则表达式
string    要匹配的字符串。
maxsplit    分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags    标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
'''

str=re.split('\W+','runoob, runoob, runoob.')
print(str)

str=re.split('(\W+)','runoob, runoob, runoob.')
print(str)
#(re) 代表的是括号内的表达式也成为一个组




猜你喜欢

转载自blog.csdn.net/qq_28711703/article/details/79825004