python中正则表达式以及re模块的使用

时间:2022-07-05 03:53:49

20个常用的正则表达式校验正则表达式设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,则认为它“匹配”

1.正则表达式的基本语法

正则表达式中的特殊字符

符号

描述

符号

描述

^

正则表达式的开始字符

\b

匹配单词的开始和结束

$

正则表达式的结束字符匹配到字符串的结尾

\B

匹配不是单词开始和结束的位置

\w

匹配字母数字下划线

.

匹配任意字符

\W

匹配不是字母数字下划线的字符

[m]

匹配单个字符串

\s

匹配空白字符 \s+表示至少有一个空格

[m1,m2…n]

匹配多个字符

\S

匹配不是空白字符

[m,n]

匹配m到n区间内的数字和字母

\d{n}

匹配n个数字 \d{n,m}n到m个数字

[^m]

匹配除m以外的字符串

\D

匹配非数字的字符

()

对正则表达式进行分组,一对圆括号表示一组


[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线等价于\w

[^0-9]等价于\D

正则表达式中常用的限定符

符号

描述

*

匹配零次或多次

+

匹配一次或多次

?

匹配一次或零次

{m}

重复m次

{m,n}

重复m到n次,其中n可以省略,表示m到任意次

*?

匹配零次或多次且最短匹配(非贪婪匹配)

+?

匹配一次或多次且最短匹配


例:匹配以任意空格隔开的的带区号的电话号码:\d{3}-\d{8} | \d{4}-\{7,8} (A|B可以匹配A或B)

[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串

[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

匹配腾讯QQ号:[1-9]\d{4,} 

(\d{3}[.-]?){2}\d{4}匹配的字符串是连续两个括号的三位数字,每三位数字后可以带连字符也可以不带,最后是一个四位数字。


正则表达式通常用于两种任务:1.验证,2.搜索/替换。用于验证时,通常需要在前后分别加上^和$,以匹配整个待验证字符串;搜索/替换时是否加上此限定则根据搜索的要求而定,此外,也有可能要在前后加上\b而不是^和$。

/^ 和 $/成对使用应该是表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串。

例如校验密码:只能输入6-20个字母、数字、下划线:^\w{6,20}$

匹配网址URL:[a-z\A-Z]+://[^\s]*( 除空格以外任意个字符串)^http[s]{0,1}:\/\/.+$

E-mail正则匹配表达式:/^[a-z]([a-z0-9]*[-_]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?$/i

http://www.biancheng.net/cpp/html/1432.html这里 有关于这个正则表达式的具体的详解

简单的e-mail匹配:

^[\w_-]+@[\w_-]+(\.[\w_-]+)+
\.[\w_-]+ 表示有1次或n次的重复

2.使用re模块处理正则表达式

Python提供re模块,包含所有正则表达式的功能

re模块中一些重要的函数:

re.findall根据正则表达式在string中匹配字符串,如果匹配成功,返回包含匹配结果的列表匹配失败,返回空列表

re.compile 将正则表达式转换为模式对象,可以实现更有效率的匹配。

re.search  会在给定字符串中寻找第一个匹配给正则表达式的子字符串,只返回第1次匹配成功的对象,匹配失败,返回None

处理不同分隔符电话号码

>>>PhonePattern = re.compile(r'^(\d{3})\D+(\d{3})\D+(\d{4})\D+(\d+)$')
>>> PhonePattern.search('800 244 1234 1234').groups()
('800','244','1234','1234')
>>> PhonePattern.search('800-555-1212-1234').groups()
('800', '555', '1212', '1234')
>>> PhonePattern.search('80055512121234')
>>>
>>> PhonePattern.search('800-555-1212')
>>>
 \D+ 匹配一个或者多个不是数字的字符。

处理没有分隔符的数字电话号码

>>> PhonePattern = re.compile(r'^(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$')
>>>PhonePattern.search('80055512121234').groups()
('800', '555', '1234', '1234')
>>> phonePattern.search('800-555-1212').groups()
('800', '555', '1212', '')
\D* 匹配0个或者多个不是数字的字符。

处理开始有字符的电话号码

>>> PhonePattern = re.compile(r'^\D*(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$')
>>> PhonePattern.search('(800)5551212 x1234')
('800','555,'1212','123')

匹配任何类型的电话号码

>>>phonePattern = re.compile(r'(\d{3})\D*(\d{3})\D*(\d{4})\D*(\d*)$')
>>> phonePattern.search('work 1-(800) 555.1212 #1234').groups()
('800', '555', '1212', '1234')
在这个正则表达式的开始少了一个 ^ 字符,不再匹配字符串的开始,正则表达式引擎将要努力计算出开始匹配输入字符串的位置,并且从这个位置开始匹配。
练习:十位北美电话号码

re.sub(pattern,repl,string)根据指定的正则表达式替换源字符串的子串。repl是用于替换的字符串。

>>>import re
>>>s="hello world"
>>>re.sub("hello","hi",s[-4:]) #在字符串"orld"中替换"hello"
'orld'
>>>re.sub("world","china",s[-5])#把字符串"world"替换为"china"
'china'
>>>str="hello world world"
>>>re.sub("world$","china",s)
'hello,world,china'
>>>s='Monday Mondayboring Fri’
>>>re.sub(r'\bMonday','Mon',s)
'Mon Monboring Fri'
>>>re.sub(r'\bMonday\b','Mon',s) #\b字符串\b表示匹配字符串作为整个单词出现
'Mon Mondayboring Fri'
>>>>s='Fri Monday Mondayboring’
>>>>re.sub(r'\bMonday$','Mon',s) # \b字符串$包含有作为整个单词的'字符串'且在s的末尾
'Fri Monday Mondayboring’

 
 
注:sub()先创建变量s的拷贝,然后在拷贝中替换字符串,并不会改变字符串变量s的内容 

re.match 根据正则表达式的头部开始匹配字符串,只返回第一次匹配成功的对象,否则返回none

 import re
>>> re.match(r'^\d{3,4}\-\d{4,8}$','025-123456')
<_sre.SRE_Match object at 0xb7728fa8>
>>> re.match(r'^[\(]?\d{3}[\)]?\d{8}$','(010)12345678')  #[\(-]? 表示最多只能取“(” 或“-”其中之一<_sre.SRE_Match object at 0xb773c4b8>
test = '用户输入的字符串'if re.match(r'正则表达式', test):    print 'ok'else:    print 'failed'
 

re.split 会根据模式的匹配项来分割字符串。

用正则表达式切分字符串比用固定的字符更灵活

>>> re.split(r'\s+', 'a b c')
['a', 'b', 'c']
>>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']

正则表达式还可以提取分组。()表示的就是要提取的分组(Group)

所有分组的匹配结果。每个分组的匹配结果组成1个列表返回

<pre name="code" class="python">>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object at 0x1026fb3e8>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
>>> m.group()
('010','12345')

 

验证Email地址的正则表达式:格式如下: 

seven_five57@sina.com
  1 #!/usr/bin/env python
2 import re
3 test_email='seven_five57@sina.com'
4 t1=re.compile(r'^([a-zA-Z0-9]+\_?[a-zA-Z0-9]+)@([0-9a-zA-Z]+).(com)$')
5 if t1.match(test_email):
6 print 'ok'
7 else:
8 print 'failed'
9
10 print t1.match(test_email).group(0)
11 print t1.match(test_email).group(1)
12 print t1.match(test_email).group(2)
13 print t1.match(test_email).group(3)
14 print t1.match(test_email).groups()

$./re_test.py
ok
seven_five57@sina.com
seven_five57
sina
com
('seven_five57', 'sina', 'com')

注:group(0)表示匹配整个正则表达式

有关python正则表达式可参考:Python正则表达式指南 20个常用的正则表达式检验