正则

正则表达式,又称正规表示式,是计算机科学的一个概念。匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索,替换那些匹配某个模式的文本。在开发中会大量的字符串处理工作,其中经常会涉及带字符串格式的校验,比如网页中的注册表单。使用正则表达式会非常方便,例如:检测输入QQ号,E-mail地址,手机号等等。

match:

匹配。左边第一个开始算起,匹配到返回匹配对象,否则返回None(注意不是空字符串),group方法用来取值。

#!/urs/bin/evn python
# -*- coding:utf-8 -*-
import re

print(re.match("abc", "abc"))  # 匹配。左边第一个开始算起
print(re.match("Xabc", "abc"))  # 匹配不成功None 匹配成功返回位置详细信息
print(re.match("abc", "Xabc"))
print(re.match("abc", "abcX"))

# match 严格匹配。从一个一个开始
matchobj = re.match("abc", "abcdefgag")
print(matchobj)
print(type(matchobj))
print(matchobj.group(0))  # 挖掘的第一个匹配

line = "xqxzq is a boy not a gril"
matchobj = re.match(r"(.*) is (.*)", line)
print(matchobj)  # 详细匹配
print(matchobj.group(0))
print(matchobj.group(1))
print(matchobj.group(2))

结果:

<_sre.SRE_Match object; span=(0, 3), match='abc'>
None
None
<_sre.SRE_Match object; span=(0, 3), match='abc'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
<class '_sre.SRE_Match'>
abc
<_sre.SRE_Match object; span=(0, 25), match='xqxzq is a boy not a gril'>
xqxzq is a boy not a gril
xqxzq
a boy not a gril
View Code
search

search(pattern, string, flags=0)
string:匹配的正则表达式
pattern:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
功能:整个字符串,并返回第一个成功的匹配的对象,否则返回None。


#!/urs/bin/evn python
# -*- coding:utf-8 -*-
import re

print(re.match("abc", "abcxyz"))
print(re.match("xyz", "abc xyz"))  # 匹配从第一个开始

print(re.search("abc", "abcxyz"))
print(re.search("xyz", "abc xyz"))  # 包含就可以

searchobj = re.search("abc", "abc xyz")
print(searchobj)
print(searchobj.group())
print(searchobj.group(0))

searchobj = re.search(r"(.*)-is-(.*)", "abc xyz-is-go")
print(searchobj)
print(searchobj.group())
print(searchobj.group(0))
print(searchobj.group(1))
print(searchobj.group(2))


结果:
<_sre.SRE_Match object; span=(0, 3), match='abc'>
None
<_sre.SRE_Match object; span=(0, 3), match='abc'>
<_sre.SRE_Match object; span=(4, 7), match='xyz'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
abc
abc
<_sre.SRE_Match object; span=(0, 13), match='abc xyz-is-go'>
abc xyz-is-go
abc xyz-is-go
abc xyz
go
View Code
findall

findall(pattern, string, flags=0)
string:匹配的正则表达式
pattern:要匹配的字符串
flags:标志位,用于控制正则表达式的匹配方式
功能:整个字符串,并返回结果列表
(finditer()函数相似 )


QQstr = "498235786@qq.com"

searchobj = re.findall("[1-9]d{4,10}", QQstr)
print(searchobj)  # 搜索全部
View Code

sub与subn  替换

import  re
"""
safestr="全能神  全能神 全能神 全能神"
#safestr=re.subn("全能神","宇宙真理",safestr) #替换
safestr=re.subn("全能神","",safestr) #删除
print(safestr)
print(safestr[0])
print(safestr[1])
"""
safestr="132  21323 213 213 213"
safestrlast=re.subn("\d+", "ABC", safestr) #删除
print(safestrlast)
print(safestr[0])
print(safestr[1])  # 全部替换
print("*"*50)
safestr="132  21323 213 213 213"
safestrlast=re.sub("\d+","ABC",safestr) #删除
print(safestrlast)

结果;
('ABC  ABC ABC ABC ABC', 5)
1
3
**************************************************
ABC  ABC ABC ABC ABC
View Code

split:

split根据匹配进行切割字符串,并返回一个列表
# -*-coding:utf-8 -*-
import re
"""
字符串切割
line="363316626-----3633166268190x10"
linelist=line.split("-----")
print(linelist)
"""
line="1277403 1小姐    22   166 本科 合肥    双鱼座    普通话"
mylist=re.split("\s+",line)
print(mylist)
line1="a,b c: d; "
li=re.split(r"[\s\,:;]",line1)
print(li)

结果:
['1277403', '1小姐', '22', '166', '本科', '合肥', '双鱼座', '普通话']
['a', 'b c', ' d', ' ']
View Code
匹配分组:
| 匹配左右任意一个表达式
(ab) 将括号中字符作为一个分组
um 引用分组num匹配到的字符串
(?P<name>) 分组起别名
(?P=name) 引用别名为name分组匹配到的字符串


表示边界
^ 匹配字符串开头
$ 匹配字符串结尾
 匹配一个单词的边界
B 匹配非单词边界
[] 匹配任意一个



表示数量
. 匹配前一个字符出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少出现m次
{m,n} 匹配前一个字符出现从m到n次


# 一元字符 (. ^ $ + ? {} | ())


d 匹配任何数字,它相当于[0-9]
D 匹配任何非数字字符,它相当于[^0-9]
s 匹配任何空白字符,它相当于[ fv]
S 匹配任何非空白字符,它相当于[^ fv]
w 匹配任何字母数字字符,它相当于[a-zA-Z0-9]
w 匹配任何非字母数字字符,它相当于[^a-zA-Z0-9]
 匹配到一个单词边界,也就是指单词和空格间的位置



re.I 匹配对大小不敏感,忽略异常
re.L 做本地化匹配
re.M 多行匹配,影响^ 和 $
re.S 使.匹配包过换行在内的所有字符
re.U 根据Unicde字符解析字符,这个标志影响w, W, 
re.X
常见的匹配:

#!/urs/bin/evn python
# -*- coding:utf-8 -*-
import re
Emailstr = "462928483@qq.com"
Emai=re.compile("([A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4})", re.IGNORECASE)
searchobj= re.findall(Emai, Emailstr)
print(searchobj)



searchobj1 = re.findall("1[34578]\d{9}", "13623413412")
print(searchobj1)


busstr= re.sub(r"php", "python", "itcast python php python php")
print(busstr)

busstr1= re.sub(r"d+", "50", "python=1000 php=50")
print(busstr1)

# sub将匹配到的数据进行替换

ret = re.search(r"d+", "阅读次数为 9999")
print(ret.group())


p = r"(w+)@(163|126|gmail|qq).(com|cn|net)$"
r = re.match(p, Emailstr)
print(r.group())

s = "<html><h1>百度一下</h1></html>"
re.match(r"(<.+><.+>.+</.+></.+>)", s)
print(s)



结果:
['462928483@qq.com']
['13623413412']
itcast python python python python
python=50 php=50
9999
462928483@qq.com
<html><h1>百度一下</h1></html>
View Code
import re

m = re.search(r"^0[1-9](d{1,2})-[1-9](d{6,7})$", "0571-1234567")
if m is not None:
    print(m.group())
else:
    print(None)


结果:
0571-1234567
View Code
import re

m = re.search(r"((25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(25[0-5]|2[0-4]d|((1d{2})|([1-9]?d)))", "127.0.0.1")
if m is not None:
    print(m.group())
else:
    print(None)

结果

127.0.0.1
View Code
import re

m = re.search(r"^((((19|20)d{2})-(0?[13-9]|1[012])-(0?[1-9]|[12]d|30))|(((19|20)d{2})-(0?[13578]|1[02])-31)|(((19|20)d{2})-0?2-(0?[1-9]|1d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29))$", "1985-05-22")
if m is not None:
    print(m.group())
else:
    print(None)
import re

m = re.search(r"(^[1-9]d{5}(18|19|([23]d))d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$)|(^[1-9]d{5}d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{2}[0-9Xx]$)", "")
if m is not None:
    print(m.group())
else:
    print(None)



十八位:^[1-9]d{5}(18|19|([23]d))d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{3}[0-9Xx]$

十五位:^[1-9]d{5}d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)d{2}[0-9Xx]$
View Code
正则表达式:
出生日期1800-2099 (18|19|20)?d{2}(0[1-9]|1[012])(0[1-9]|[12]d|3[01])
身份证正则表达式 /^d{6}(18|19|20)?d{2}(0[1-9]|1[012])(0[1-9]|[12]d|3[01])d{3}(d|[xX])$/
位校验规则 6位地址编码+8位出生日期+3位顺序号+1位校验位



原文地址:https://www.cnblogs.com/zqxqx/p/9308631.html