设为首页 | 加入收藏
首页 bet36最新备用体育
程序人生互联网新闻黑客新闻网络创业
WEB开发
PHPJSPASP.NETJavascriptAJAXjQueryNode.js
编程语言
JavaGolangPythonC++C语言VC++C#
站长之家
建站技巧网络赚钱网站安全
数据库
MySQLMSSQLSQLiteMongoDBRedisAccess存储技术
网页设计
HTML+DIV+CSSFlash网页制作技巧
网络技术
网络综合网络管理无线技术云计算云技术攻防知识安全防护
学电脑
电脑常识WindowsLinuxCPU内存显卡硬盘主板
学开发
开发总结365bet行政收费_365bet提款维护_365bet足球开户盘口开发工具开发手册面试题
w3school
学开发 > 开发总结 >

Python正则表达式【Python】

发布时间:2017-09-18 | 阅读次数:490
正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行;
正则表达式语言相对小型和受限(功能有限);
并非所有字条串处理都能用正则表达式完成;
正则表达式第一功能是能够匹配不定长的字符集,另一个功能就是你可以指定正则表达式的一部分重复次数。

字符匹配规则

普通字符
大多数字母和字符一般都会和自身匹配
如正则表达式test会和字符串"test"完全匹配
元字符
. ^ $ * + ? {} [] \ | ()

[]
常用来指定一个字符集:[abc]、[a-z]、[A-Z]、[0-9]
元字符在字符集中不起作用: [akm$]
补集匹配不在区间范围内的字符:[^5]
^
匹配行首,除非设置MULTILINE标志,它只是匹配字符串的开始。在MULTILINE模式里,它也可以直接匹配字符串中的每个换行。
$
匹配行尾,行尾被定义为要么是字符串尾,要么是一个换行字符后面的任何位置。
实例:
import re #使用正则时导入re模块
#匹配包含abc的内容
r=r'abc' #字符串前用r 保持字符串的原意
print (re.findall(r,"aaaaabcaaabcaa")) #输出 ['abc', 'abc']
#匹配t开头,p结尾,中间是i或o的任何一个
r=r"t[io]p"
print (re.findall(r,'top tip tqp twp tep')) #输出['top', 'tip']
#匹配非t开头,p结尾,中间是i或o的任何一个的其它字符
r=r"t[^io]p"
print (re.findall(r,'top tip tqp twp tep')) #输出 ['tqp', 'twp', 'tep']
#匹配hello开头的内容
r=r"^hello"
print (re.findall(r,'hello boy')) #输出 ['hello']
#匹配boy结尾的内容
r=r"boy"
print (re.findall(r,'hello boy')) #输出 ['boy']

\
1、反斜杠后面可以加不同的字符以表示不同特殊意义
2、也可以用于取消所有的元字符:\[ 或 \\
\d 匹配任何十进制数:它相当于类 [0-9]
\D 匹配任何非数字字符:它相当于类 [^0-9]
\s 匹配任何空白字符:它相当于类 [\t\n\r\f\v]
\S 匹配任何非空白字符:它相当于类 [^\t\n\r\f\v]
\w 匹配任何字母数字字符:它相当于类 [a-zA-Z0-9_]
\W匹配任何非字母数字字符:它相当于类 [^a-zA-Z0-9_]
实例:
import re
#匹配0-9的数字
r=r"\d"
print (re.findall(r,'1234566587')) #输出 ['1', '2', '3', '4', '5', '6', '6', '5', '8', '7']

*
指定前一个字符可以被匹配零次或更多次,而不是只有一次。匹配引擎会试着重复尽可能多的次数(不超过整数界定的范围,20亿)
实例:
import re
r=r'ab*'
print (re.findall(r,'a')) #输出['a']
print (re.findall(r,'ab')) #输出['ab']
print (re.findall(r,'abbbb')) #输出['abbbb']

+
表示匹配一次或更多次
注意*和+之间的不同;*匹配零或更多次,所以可以根本不出现,而+则要求至少出现一次
匹配一次或零次;你可以认为它用于标识某事物是可选的,匹配某个字符可有可无时使用;
{m,n}
1、其中m和n是十进制整数。该限定符的意思是至少有m个重复,至多到n个重复。 a/{1,3}b
2、忽略m会认为下边界是0,而忽略n的结果将是上边界为无穷大(实际上是20亿)
3、{0,}等同于*,{1,}等同于+,而{0,1}则与?相同。如果可以的话,最好使用*,+,或?
实例:
import re
r=r'a{1,3}'
print (re.findall(r,'a')) #输出['a']
print (re.findall(r,'b')) #输出[]
print (re.findall(r,'aaaaa')) #输出['aaa', 'aa']

使用正则表达式
1、re模块提供了一个正则表达式引擎的接口,可以让你将REstring编译成对象并用它们进行匹配。
2、编译正则表达式,编译过的正则在匹配的时候速度快
#!python
>>> import re
>>> r1=r"\d{3,4}-?\d{8}"
>>> re.findall(r1,"010-12345678")
>>> ['010-12345678']
>>> p_tel=re.compile(r1) #编译模块
>>> p_tel
<_sre.SRE_Pattern object at 0x7ff3facc29d0>
>>> p_tel.findall('010-12345678') #使用这个正则的对象去做匹配操作
>>> ['010-12345678']
3、re.compile()也接受可选标志参数,常用来实现不同的特殊功能和语法变更
#!python
>>> p=re.compile('ab*',re.IGNORECASE)
>>> p=re.compile(r'csvtaaaa',re.I) #I 不区分大小写

4、反斜杠的麻烦
字符串前加"r"反斜杠就不会被任何特殊方式处理
字符 阶段
\section 要匹配的字符串
\\section 为re.compile取消反斜杠的特殊意义
"\\\\section" 为"\\section"的字符串实值(string literals)取消反斜杠的特殊意义

模块级函数
re模块也提供了顶级函数调用,如 match()、search()、sub()、subn()、split()、findall()等
>>> dir(re) #查看所有内置的方法

编译标志 flags
标志 含义
DOTALL,S 使 . 匹配包括换行在内的所有字符
IGNORECASE,I 使匹配对大小写不敏感
LOCALE,L 做本地化识别(locale-aware)匹配.法语等“e”或“c”
MULTILINE,M 多行匹配,影响^和$
VERBOSE,X 能够使用REs的verbose状态,使之被组织得更清晰易懂
#!python
charref=re.compile(r"'"
(
[0-9]+[^0-9] #Decimal form
| 0[0-7]+[^0-7] #Octal form
| x[0-9-fA-F]+[^0-9a-fA-F] #Hexadecimal form
)
"'",re.VERBOSE)
实例:
>>> import re
>>> r1=r"csvt.net" #这里的.代表包括换行在内的所有字符
>>> re.findall(r1,'csvt\nnet')
[]
>>> re.findall(r1,'csvt\nnet',re.S)
['csvt\nnet']

分组
"("和")"
分组可以把相关的数据划为一个整体,当做匹配的时候会优先返回分组中的数据
实例:
>>> import re
>>> email=r"\w{3}@\w+(\.com|\.cn)" #匹配邮箱地址
>>> re.findall(email,'zzz@csvt.com')
['.com']

匹配
'RegexObject'实例有一些方法和属性,完整的列表可查阅 Python Library Reference
方法/属性 作用
match() 决定RE是否在字符串刚开始的位置匹配
search() 扫描字符串,找到这个RE匹配的位置
findall() 找到RE匹配的所有子串,并把他们作为一个列表返回
finditer() 找到RE匹配的所有子串,并把它们作为一个迭代器返回
如果没有匹配到的话,match()和search()将返回None
如果成功的话,就会返回一个'MatchObjict'实例
实例:
#!python
>>> import re
>>> r1=r"\d{3,4}-?\d{8}"
>>> re.match(r1,"010-12345678") #在起始位置匹配,匹配到返回一个对象,匹配不到返回空
<_sre.SRE_Match object at 0x7f851361d308>
>>> re.search(r1,"aaa010-12345678bbb") #在任意位置匹配,匹配到返回一对象,匹配不到返回空
<_sre.SRE_Match object at 0x7f851361d308>
>>> re.findall(r1,"aaa010-12345678bbb") #在任意位置匹配,匹配到返回一个列表,匹配不到返回空的列表[]
['010-12345678']
>>> x=re.finditer(r1,"aaa010-12345678bbb") #返回迭代
>>> x.next()
<_sre.SRE_Match object at 0x7f851361d308>

MatchObject实例方法
方法/属性 作用
group() 返回被RE匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配(开始,结束)的位置
实际程序中,最常见的作法是将'MatchObject'保存在一个变量里,然后检查它是否为None
#!python
p=re.compile(...)
m=p.match('string goes here')
if m:
print ('Match found:',m.group())
else:
print (Nomatch)
实例:
#!python
>>> import re
>>> r1=r"\d{3,4}-?\d{8}"
>>> x=re.match(r1,"010-12345678")
>>> x
<_sre.SRE_Match object at 0x7f851361d370>
>>> x.group() #执行对象里group的方法
'010-12345678' #返回match 匹配到内容


替换
实例:
>>> rs=r'c..t'
>>> re.sub(rs,'python','csvt caat cvvt cccc')
'python python python cccc'
>>> re.subn(rs,'python','csvt caat cvvt cccc')
('python python python cccc', 3) #subn显示一共替换了多少次

切割
实例:
>>> ip="1,2,3,4"
>>> ip.split('.')
['1,2,3,4']
>>> s="123+456-789*000"
>>> re.split(r'[\+\-\*]',s)
['123', '456', '789', '000']



爬虫
import re #导入re正则模块
import urllib #导入采集用的urllib模块
def getHtml(url):
page=urllib.urlopen(url) #打开url,返回一个对象
html=page.read() #读取对象的内容
return html
def getImg(html,url=''):
reg=r'src="(.*)"/'
image=re.compile(reg) #为了运行速度快,编译正则
imglist=re.findall(image,html) #使用正则匹配出图片地址
x=0
for imgurl in imglist:
if url:
imgurl=url+imgurl
urllib.urlretrieve(imgurl,'%s.jpg' % x) #下载图片,重新命名x.jpg
x+=1
return True
html=getHtml('http://www.webkf.net/index/62/91638.html')
#print (html)
print (getImg(html,'http://www.webkf.net'))


上一篇:没有了
下一篇:Python模块【Python】