Python 正则表达式

一些常用的内容,均以例子代码形式给出,估计能更好更快理解(内容不全,边学边补吧)

一、原子

import re

# 普通字符作为原子
string = "taoyunjiaoju"
pat = "yun"
rst = re.search(pat, string)
print(rst)  # <re.Match object; span=(3, 6), match='yun'>


# 非打印字符作为原子
# \n 换行符  \t 制表符
string = '''taoyunjiaoju
nihao'''   # ''' '''可以用来匹配非打印字符
pat = '\n'
rst = re.search(pat, string)
print(rst)  # <re.Match object; span=(12, 13), match='\n'>

# 通用字符作为原子 ''' \w 字母,数字,下划线 \W 除字母、数字、下划线 \d 十进制数字 \D 除十进制数字 \s 空白字符 \S 除空白字符 ''' string = '''taoyunji8 736789aoyu''' pat = '\w\d\s\d\d' rst = re.search(pat, string) print(rst) # <re.Match object; span=(7, 12), match='i8 73'>
# 原子表 string = '''taoyunji8736789aoyu''' pat = 'tao[yab]un' rst = re.search(pat, string) print(rst) # <re.Match object; span=(0, 6), match='taoyun'> # []匹配原子表中出现的任意一个字符,刚好[yab]中含有y,因此匹配到了taoyun,若是pat为[abc],此时则匹配不到 pat = 'tao[^yab]' rst = re.search(pat, string) print(rst) # None # 原子表[]中加一个 ^ 表示不匹配原子表中出现的字符,因为本例中[^yab]而string中tao后面刚好是y,所以匹配不到

二、元字符

# 元字符
'''
. 除换行符外的任意一个字符
^ 开始位置
$ 结束位置
* 0\1\多次
+ 1\多次
{n} 恰好n次
{n,}至少n次
{n, m} 至少n次,之多m次
| 模式选择符
()模式单元
'''
import re
string
= '''taoyunji5289894379aoyu''' pat = 'tao...' rst = re.search(pat, string) print(rst) # <re.Match object; span=(0, 6), match='taoyun'>
pat = '^taoyun' pat1 = '^yunji' rst = re.search(pat, string) rst1 = re.search(pat1, string) print(rst) # <re.Match object; span=(0, 6), match='taoyun'> print(rst1) # None 因为^ 是从开始位置匹配,而y不是string的开头位置
pat = 'yu$' rst = re.search(pat, string) print(rst) # <re.Match object; span=(20, 22), match='yu'>
pat = 'tao.*' rst = re.search(pat, string) print(rst) # <re.Match object; span=(0, 22), match='taoyunji5289894379aoyu'> string = '''taoyunnnnnnji5289894379aoyu''' pat = 'yun{2,8}' # 匹配n至少2次,之多8次。 而string里yun后面刚好还有大于2小于8个连续的n rst = re.search(pat, string) print(rst) # <re.Match object; span=(3, 11), match='yunnnnnn'>

 

三、模式修正符

# 模式修正符
'''
I 匹配是忽略大小写
M 多行匹配
L 本地化识别匹配
U 根据Unicode字符集解析字符
S 让.匹配包括换行符
'''
import re
string
= "Python" pat = 'pyt' rst = re.search(pat, string, re.I) # 忽略大小写,Pyt与pyt就可以匹配了 print(rst)

四、贪婪模式和懒惰模式

import re

string = 'poytnythony'
pat = 'p.*y'
pat1 = 'p.*?y'  # 以懒惰模式匹配
rst = re.search(pat, string)  # 默认是贪婪模式
print(rst)  # <re.Match object; span=(0, 11), match='poytnythony'>   贪婪模式
rst1 = re.search(pat1, string)
print(rst1)  # <re.Match object; span=(0, 3), match='poy'>  懒惰模式

五、正则表达式函数

# 正则表达式函数
import re
# 1、match
string = 'poythonyhjskjsa'
pat = 'p.*?y'  # 懒惰模式
rst = re.match(pat, string, re.I)  # match从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none
print(rst)  # <re.Match object; span=(0, 3), match='poy'>

# 2、search  上面几个例子用的都是search()函数,re.search 扫描整个字符串并返回第一个成功的匹配。

# 3、compile()全局匹配函数,用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
string = 'poythopnyhjskptyjsa'
pat = 'p.*?y'  # 懒惰模式
# 全局匹配格式re.comlipe(正则表达式).findall(数据)
rst = re.compile(pat).findall(string)
print(rst)  # ['poy', 'pny', 'pty']
# 4、sub用于替换字符串中的匹配项。
import re
 
phone = "2004-959-559 # 这是一个国外电话号码"
 
# 删除字符串中的 Python注释 
num = re.sub(r'#.*$', "", phone)
print "电话号码是: ", num
 
# 删除非数字(-)的字符串 
num = re.sub(r'\D', "", phone)
print "电话号码是 : ", num

 

六、匹配网址和匹配电话号码例子

# 匹配.com或.cn网址
import re

string = "<a href='http://www.baidu.com'>百度首页</a>"
pat = '[a-zA-Z]+://[^\s]*[.com|.cn]'
rst = re.compile(pat).findall(string)
print(rst)  # ['http://www.baidu.com']

# 匹配电话号码
string = "fkjdsnfknk021-759815413795893fjkldsnaklg0935-583498593fmkds"
pat = '\d{4}-\d{7}|\d{3}-\d{8}'
rst = re.compile(pat).findall(string)
print(rst)  # ['021-75981541', '0935-5834985']

 

posted @ 2019-10-31 20:20  +D  阅读(517)  评论(0编辑  收藏  举报