python的字符匹配re模块

re模块导入的语法小例子:

1
2
3
4
5
6
7
8
9
10
11
import re #导入模块名

p = re.compile("^[0-9]")
#生成要匹配的正则对象 , ^代表从开头匹配,[0-9]代表匹配0至9的任意一个数字, 所以这里的意思是对传进来的字符串进行匹配,如果这个字符串的开头第一个字符是数字,就代表匹配上了

m = p.match(‘14534Abc‘) #按上面生成的正则对象 去匹配 字符串, 如果能匹配成功,这个m就会有值, 否则m为None

if m: #不为空代表匹配上了
  print(m.group())    #m.group()返回匹配上的结果,此处为1,因为匹配上的是1这个字符
else:
  print("doesn‘t match.")

上述的re.compilere.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
2
3
m = re.split("[0-9]", "alex1rain2jack3helen rachel8")
print(m)
#结果:['alex', 'rain', 'jack', 'helen rachel', '']

例2

1
2
3
4
S="alex1rain2jack3helen rachel8"
m=re.findall("[0-9]",S)
print(m)
#结果:['1', '2', '3', '8']

例3

1
2
3
4
5
6
7
8
S="alex1rain2jack3helen rachel8"
m1=re.sub("[0-9]","*",S,count=2)
m2=re.sub("[0-9]","*",S)
print(m1)
print(m2)

#结果:alex*rain*jack3helen rachel8
#alex*rain*jack*helen rachel*

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

例4

1
2
3
4
S="alex1rain2jack3helen rachel8"
m=re.match("[0-9]",S)
print(m.group())
#结果: None

例5

1
2
3
4
S="alex1rain2jack3helen rachel8"
m=re.search("[0-9]",S)
print(m.group())
#结果 1

##具体的一个小习题
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
30
import 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例中的正则表达式的学习(对上述的详细补充)

Python 正则表达式(个人觉得讲的不错)

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
5
import 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
4
pattern : 正则中的模式字符串。
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

热评文章