re模块导入的语法小例子:
1 | import re #导入模块名 |
上述的re.compile
和re.match
可以进行合并简写1
m=p.match("^[0-9]","14534Abc")
效果是一样的,区别在于,第一种方式是提前对要匹配的格式进行了编译(对匹配公式进行解析),这样再去匹配的时候就不用在编译匹配的格式,第2种简写是每次匹配的时候 都 要进行一次匹配公式的编译,第一种匹配在文本量大的时候,匹配速度更快
正则表达式的基本匹配格式:
模式 | 描述 |
---|---|
^ | 匹配字符串的头部 |
$ | 匹配字符串的尾部 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 |
[….] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a‘,‘m‘或‘k‘ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
+ | 匹配1个或多个的表达式 |
? | 匹配0个或1个由前面的正则表达式定义的片段 |
* | 匹配0个或多个的表达式 |
{n} | 精确匹配n个表达式 |
{n,} | 匹配不少于n个的表示 |
{n,m} | 匹配不少于n个不大于m个的表达式 |
re中的正则表达式匹配格式
模式 | 描述 |
---|---|
re* | 匹配0个或多个的表达式 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
\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_]‘。 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结束 |
re中正则表达式的常用的5种操作
函数 | 实现的功能 |
---|---|
re.match(pattern,string) | 从头开始匹配 |
re.search(patter,string) | 匹配整个字符串,直到找到一个匹配 |
re.split() | 将匹配到的格式当做分割点,对字符串分割成列表 |
re.findall() | 找到所有匹配的字符串并返回列表的格式 |
re.sub(pattern, repl, string, count,flag) | 替换匹配到字符串 |
例1
1 | m = re.split("[0-9]", "alex1rain2jack3helen rachel8") |
例2
1 | S="alex1rain2jack3helen rachel8" |
例3
1 | S="alex1rain2jack3helen rachel8" |
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
例4
1 | S="alex1rain2jack3helen rachel8" |
例5
1 | S="alex1rain2jack3helen rachel8" |
##具体的一个小习题
python 100例中的31例
题目:题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30import re
list=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'];
def judge(first,list):
choice=[]
first=first.upper()
for s in list:
if re.match(first,s):
choice.append(s)
if len(choice)<=0:
print('data error,can not find match string')
exit(0)
if len(choice)==1:
print(choice[0])
exit(0)
else:
second=input('second string:')
second=second.lower()
flag=1
for s in choice:
if re.match(first+second,s):
print(s)
flag=0
if flag==1:
print('data error,can not find match string')
first=input("input first str")
judge(first,list)
python 100例中的正则表达式的学习(对上述的详细补充)
match
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:1
re.match(pattern, string, flags=0)
flag标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
正则表达式修饰符-可选标志
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别(locale-aware)匹配 |
re.M | 多行匹配,影响 ^ 和 $ |
re.S | 使 . 匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
这个匹配返回的东西,是真的骚,返回是一个对象!!!!!,而且返回的是匹配的对象,必须使用group获取表达式
匹配对象方法 | 描述 |
---|---|
group(num=0) | 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 |
groups() | 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。 |
一个例子:1
2
3
4
5import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
#结果:(0, 3)
#结果:(11, 14)
1 | m.span() 返回一个tuple表示(m.start(), m.end()) |
检索和替换
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。语法:1
re.sub(pattern, repl, string, count=0, flags=0)
参数:1
2
3
4pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/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