Loading

09_Python_RE正则表达式

1、re模块简介

  • 在 Python 中,已经内置了一个re模块,用来帮助我们使用正则表达式。

【re模块中的函数】

       函数  	            描述
compile(pattern)	        创建模式对象
search(pattern,string)	    在字符串中寻找模式
match(pattern,string)  	在字符串开始处匹配模式
split(pattern,string)	    根据模式分割字符串
findall(pattern,string)	    列表形式返回匹配项
sub(pat,repl,string)	    pat匹配想用repl替换
escape(string)	            特殊字符转义

2、compile 函数

  • compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下:
re.compile(pattern[, flag])


- pattern 是一个字符串形式的正则表达式,
- flag 是一个可选参数,表示匹配模式,比如忽略大小写,多行模式等。
  • 实例
import re
# 将正则表达式编译成 Pattern 对象 
pattern = re.compile(r'\d+')

2.1、match 方法

  • match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。
  • 它的一般使用形式如下:
match(string[, pos[, endpos]])



- string 是待匹配的字符串;
- pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。因此,当你不指定 pos 和 endpos 时,match 方法默认匹配字符串的头部。
- 当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。
  • 实例
import re

pattern = re.compile(r'\d+')  # 用于匹配至少一个数字
m = pattern.match('0123456789ur', 3, 10)  # 从'3'的位置开始匹配,

print(m)  # 返回一个 Match 对象

# group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);
print(m.group(0))

# start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
print(m.start(0))

# end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
print(m.end(0))

# span([group]) 方法返回 (start(group), end(group))。
print(m.span(0))

2.2、search 方法

  • search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有匹配的结果。
  • 它的一般使用形式如下:
search(string[, pos[, endpos]])


- string 是待匹配的字符串;
- pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。
- 当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。
  • 实例
import re

pattern = re.compile(r'\d+')  # 用于匹配至少一个数字
m = pattern.search('one12twothree34four')
print(m.group())    # 输出:12

'''2、指定字符串区间'''
m1 = pattern.search('one12twothree34four', 10, 30)
print(m1)           # 输出:<_sre.SRE_Match object; span=(13, 15), match='34'>
print(m1.group())   # 输出:34
print(m1.span())     # 输出:(3, 5)

2.3、findall 方法

  • findall 以列表形式返回全部能匹配的子串,如果没有匹配,则返回一个空列表。
  • findall 方法的使用形式如下:
findall(string[, pos[, endpos]])


- string 是待匹配的字符串;
- pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。
  • 实例:
import re

'''1、返回全部能匹配的子串'''

pattern = re.compile(r'\d+')
m = pattern.findall('one12twothree34four')
print(m)  # 输出:['12', '34']

'''2、指定字符串区间'''

m1 = pattern.findall('one12twothree34four', 0, 10)
print(m1)  # 输出:['12']

2.4、finditer 方法

  • finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match 对象)的迭代器。

  • 实例:

import re

pattern = re.compile(r'\d+')
result_01 = pattern.finditer('one1two2three3four4')
print(result_01)
for i in result_01:
    print(i.group())

# 输出结果:
'''
1
2
3
4
'''

2.5、split 方法

  • split 方法按照能够匹配的子串将字符串分割后返回列表。
  • 它的使用形式如下:
split(string[, maxsplit])

- maxsplit 用于指定最大分割次数,不指定将全部分割。
  • 实例:
import re

pattern = re.compile(r'\d+')
# 匹配数字,根据数字把字符串切割成列表
result_01 = pattern.split('one1two2three3four')
print(result_01)
# 输出结果:['one', 'two', 'three', 'four']

2.6、sub 方法

  • sub 方法用于替换。它的使用形式如下:
sub(repl, string[, count])


repl 可以是字符串也可以是一个函数:
    1、 repl 是字符串,则会使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,另外,repl 还可以使用 \id 的形式来引用分组,但不能使用编号 0;
    2、repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。

count 用于指定最多替换次数,不指定时全部替换。
  • 实例:
import re

'''1、repl 是字符串'''

pattern = re.compile(r'\d+')
s = 'one1two2three3four'
# 匹配数字,根据数字把字符串切割成列表
result_01 = pattern.sub('替换', s)
print(result_01)

# 输出结果:one替换two替换three替换fou


'''1、repl 是函数'''

def func(m):
    return '替换' + ' ' + m.group()


result_02 = pattern.sub(func, s)
print(result_02)

# 输出结果:one替换 1two替换 2three替换 3four

3、match 函数

  • match 函数的使用形式如下:
re.match(pattern, string[, flags]):

  • 实例:
import re

result_01 = re.match(r'\d+', '2One12twothree34four')
print(result_01.group())  # 输出:2

4、search 函数

  • search 函数的使用形式如下:
re.search(pattern, string[, flags])

5、findall 函数

  • findall 函数的使用形式如下:
re.findall(pattern, string[, flags])

'''【实例】'''

import re

result_01 = re.findall(r'\d+', '2One12twothree34four')
print(result_01)  # 输出:['2', '12', '34']

6、finditer 函数

  • finditer 函数的使用形式如下:
re.finditer(pattern, string[, flags])

7、split 函数

  • split 函数的使用形式如下:
re.split(pattern, string[, maxsplit])

8、sub 函数

  • sub 函数的使用形式如下:
re.sub(pattern, repl, string[, count])

9、匹配中文

import re

title = u'你好,hello,世界'

pattern = re.compile(r'[\u4e00-\u9fa5]+')
result = pattern.findall(title)
print(result)
# 输出结果:['你好', '世界']

10、正则表达模式


'''字符匹配'''

实例	            描述
[Pp]ython	    匹配 "Python" 或 "python"
rub[ye]	        匹配 "ruby" 或 "rube"
[aeiou]	        匹配中括号内的任意一个字母
[0-9]	        匹配任何数字。类似于 [0123456789]
[a-z]	        匹配任何小写字母
[A-Z]	        匹配任何大写字母
[a-zA-Z0-9] 	匹配任何字母及数字
[^aeiou]	    除了aeiou字母以外的所有字符
[^0-9]	        匹配除了数字外的字符


'''特殊字符类'''

实例	            描述
.	            匹配除 "\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_]'。
\W	            匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

参考:

posted @ 2018-06-30 01:55  面包的储物间  阅读(295)  评论(0)    收藏  举报