1、正则表达式是用来干嘛的?

  用来匹配字符串的  ,其中正则是意思是模糊匹配。

就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

字符匹配(普通字符,元字符):

1 普通字符:大多数字符和字母都会和自身匹配
              >>> re.findall('alvin','yuanaleSxalexwupeiqi')
                      ['alvin'] 

2 元字符:. ^ $ * + ? { } [ ] | ( ) \

元字符之. ^ $ * + ? { }

 

import re
 
ret=re.findall('a..in','helloalvin')         #一个点就代表一个字符
print(ret)#['alvin']
 
 
ret=re.findall('^a...n','alvinhelloawwwn')      #只从开头开始匹配,如果开头没有,那么就会匹配到空字符
print(ret)#['alvin']
 
 
ret=re.findall('a...n$','alvinhelloawwwn')      #只能从结尾开始匹配
print(ret)#['awwwn']
 
 
ret=re.findall('a...n$','alvinhelloawwwn')      
print(ret)#['awwwn']
 
 
ret=re.findall('abc*','abcccc')#贪婪匹配[0,+oo]     #重复匹配
print(ret)#['abcccc']
 
ret=re.findall('abc+','abccc')#[1,+oo]
print(ret)#['abccc']
 
ret=re.findall('abc?','abccc')#[0,1]
print(ret)#['abc']

ret=re.findall('a?b','aaaabhghabfb')
print(ret)#['ab','ab','b'] ret=re.findall('abc{1,4}','abccc') print(ret)#['abccc'] 贪婪匹配 #{}里面的只表示范围,指定几次,什么都不加是{1,正无穷}

 

 

注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

ret=re.findall('abc*?','abcccccc')
print(ret)#['ab']

元字符之字符集[]:

#--------------------------------------------字符集[]
ret=re.findall('a[bc]d','acd')
print(ret)#['acd']                    #[]里面表示‘或’           
 
ret=re.findall('[a-z]','acd')
print(ret)#['a', 'c', 'd']             #表示a-z都可以
 
ret=re.findall('[.*+]','a.cd+')         #[]字符集取消元字符的特殊功能,(\ ^ -)这三个例外。
print(ret)#['.', '+']                 
 
#在字符集里有功能的符号: - ^ \
 
ret=re.findall('[1-9]','45dha3')
print(ret)#['4', '5', '3']
 
ret=re.findall('[^ab]','45bdha3')
print(ret)#['4', '5', 'd', 'h', '3']        ^放在[]里面是表示取反的意思,非a和b
 
ret=re.findall('[\d]','45bdha3')
print(ret)#['4', '5', '3']                 #\d  匹配任何十进制数;它相当于类 [0-9]。

 

元字符之转义符\

反斜杠后边跟元字符去除特殊功能,比如\.
反斜杠后边跟普通字符实现特殊功能,比如\d

\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_]
\b  匹配一个特殊字符边界,比如空格 ,&,#等

ret=re.findall('I\b','I am LIST')
print(ret)#[]
ret=re.findall(r'I\b','I am LIST')
print(ret)#['I']                      加一个“r”才表示/b是在re模块里的意思,不加就会默认在python里面的/b。所以前者是[]。

 

 

现在我们聊一聊\,先看下面两个匹配:

 

#-----------------------------eg1:
import re
ret=re.findall('c\l','abc\le')
print(ret)#[]
ret=re.findall('c\\l','abc\le')
print(ret)#[]
ret=re.findall('c\\\\l','abc\le')
print(ret)#['c\\l']
ret=re.findall(r'c\\l','abc\le')
print(ret)#['c\\l']
 
#-----------------------------eg2:
#之所以选择\b是因为\b在ASCII表中是有意义的
m = re.findall('\bblow', 'blow')
print(m)                            #[]
m = re.findall(r'\bblow', 'blow')
print(m)                            #['blow']

 

import re
print(re.search('(as)+',"sdjkfasas").group())    #()作为一个整体,"+"表示对该整体进行重复匹配#asas
print(re.search("(as)|3","as63wef").group())     #|表示或,  #as
print(re.search("3|(as)","as63wef").group())                 #as
print(re.search("3|(as)","36aswef").group())                 #3
print(re.search("3|(as)","63aswef").group())                 #3
#其意思是字符串从左到右先匹配到谁就是谁

re模块下的常用方法:


import re

# # 1
# print(re.findall('a', 'alvin yuan'))  # 返回所有满足匹配条件的结果,放在列表里  #['a', 'a']
# 2
print(re.search('a', 'alvin yuan').group())  # 函数会在字符串内查找模式匹配,只到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以
# 通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。       #a

# 3
print(re.match('a', 'abc').group())  # 同search,不过仅在字符串开始处进行匹配        #a

# 4
ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret)  # ['', '', 'cd']

# 5
ret = re.sub('\d', 'abc', 'alvin5yuan6', 1)        #re.sub(被替换的,替换后的,字符串,替换次数)sub就相当于replace
print(ret)  # alvinabcyuan6
ret = re.subn('\d', 'abc', 'alvin5yuan6')
print(ret)  # ('alvinabcyuanabc', 2)

# 6
obj = re.compile('\d{3}')
ret = obj.search('abc123eeee')
print(ret.group())  # 123

 

 

 

注意:

import re
 
ret=re.findall('www.(baidu|oldboy).com','www.oldboy.com')
print(ret)#['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
 
ret=re.findall('www.(?:baidu|oldboy).com','www.oldboy.com')
print(ret)#['www.oldboy.com']

 

正则表达式的:

  1、findall():所有结果都返回到一个列表里

  2、search():返回匹配到的第一个对象(object),对象可以调用group方法返回结果。

  3、match():只在字符串开始匹配

  4、split()

import re
ret=re.split("[j,s]","djksal")#先以j为分隔符,然后在j分完的基础上用s分隔符再分
print(ret)   #['d', 'k', 'al']
import re
ret=re.split("[j,s]","sdjksal")#先以j为分隔符,然后在j分完的基础上用s分隔符再分,即使s是开头,也会分出空格来
print(ret)   #['', 'd', 'k', 'al']

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
Posted on 2018-03-01 13:38  小萝卜头12138  阅读(181)  评论(0编辑  收藏  举报