庞玉栋个人博客、人生苦短-我用Python

re正则表达式学习

发布时间:7年前热度: 1420 ℃评论数:

Python环境:3.6

需要的库:re正则表达式

正则表达式的学习

1,原子时正则表达式中最基本的组成单位,每个正则表达式至少要包含一个原子,常见的原子有以下几类:

普通字符作为原子使用,非打印字符作为原子使用,通用字符作为原子,原子表

普通字符作为原子:比如数字大小写字符,下划线等 :
pattern = 'yue'
string='http://yum.iqianyue.com'
result=re.search(pattern,string)
print(result)
输出:<_sre.SRE_Match object; span=(16, 19), match='yue'>
非打印字符:在字符串中用于格式控制的符号,比如换行符:
pattern = '\n'
string='''http://yum.iqianyue.com
http://baidu.com
'''
result=re.search(pattern,string)

输出结果:<_sre.SRE_Match object; span=(23, 24), match='\n'>

通用字符作为原子:既用一个原子就可以匹配一类字符

\w:匹配任意一个字母,数字,下划线

\W:匹配除字母,数字,下划线以外的任意一个字符

\d:匹配任意一个十进制数

\D:匹配除十进制数以外的任意一个其他字符

\s:匹配任意一个空白字符

\S:匹配除空白字符外的任意一个其他字符

Python %操作符

%s 字符串 (采用str()的显示)

%r 字符串 (采用repr()的显示)

%c 单个字符

%d 十进制整数

%i 十进制整数

%f 浮点数

%F 浮点数,与上相同%% 字符"%"

pattern = '\wpython\w'
string='abcdfphp3145pythony_py'
result=re.search(pattern,string)

输出:<_sre.SRE_Match object; span=(11, 19), match='5pythony'>

原子表:原子表用[ ]表示,匹配时会取该原子表中的任意一个原子进行匹配

[abc]:表示之匹配a或者b或者cabc这三个原子之间地位平等

[^]代表除了中括号里面的原子均能进行匹配:例如[^xyz]py能匹配apy 但是却不能匹配xpy

2,元字符

元字符就是正则表达式中具有特殊含义的字符,比如重复N次前面的字符等

常见的元字符:

. 匹配除换行符外的任意字符

^ 匹配字符串的开始位置

$ 匹配字符串的结束位置

*匹配01次多次前面的原子

?匹配0次或1次前面的原子

+ 匹配1次或多次前面的原子

{n}前面的原子正好出现n

{n,}前面的原子至少出现m

{n,m}前面的原子至少出现n次最多出现m

| 模式选择符

()模式单元符

具体来说:元字符可以分为,任意匹配字符,边界限制元字符,限定符,模式选择符,模式单元等

任意匹配元字符: 如 . :匹配一个除换行符以外的任意字符 比如 .python… 匹配一个python字符前面一位后面有三位的任意字符

边界限制元字符:

‘^’元字符匹配字符串的开始 ‘$’元字符匹配字符串的结束

限定符:

包括 * + {n}  {n}  {n,m}

模式选择符:|

可以从中选择任意一个模式匹配

模式单元符:()

可以将原子组合成一个大原子使用

模式修正符:

I:匹配时忽略大小写

M:多行匹配

L:做本地化识别匹配

U:根据Unicode字符及解析字符

S:让.匹配包括换行符,既用了该模式修正后‘.’就可以匹配任意的字符

懒惰模式与贪婪模式:

贪婪模式的核心点就是尽可能多的匹配,而懒惰模式的核心点就是尽可能少的匹配:

pattern = 'p.*y'
pattern1='p.*?y'
string='abcdfphp3145pythony_py'
result=re.search(pattern,string)
result=re.search(pattern1,string)

输出

<_sre.SRE_Match object; span=(5, 22), match='php3145pythony_py'>

<_sre.SRE_Match object; span=(5, 14), match='php3145py'>

懒惰模式是就近匹配原则,更加的精确;贪婪模式就是找字符串最后一个匹配字符

正则表达式常见的函数:

Re.match()函数:从源字符串的起始位置匹配一个模式

Re.match(pattern,string,flag)第一个参数是正则表达式第二个参数是字符串第三个是对应的标志位

Re.search():扫描整个字符串进行对应的匹配

全局匹配函数:

Re.compile()对正则表达式进行预编译编译后 根据re.findall()根据正则表达式将匹配的所有结果找出

Re.sub函数 :替换某些字符串

Re.sub(pattern,rep,string,max)

第一个参数为对应的正则表达式,第二个参数为替换的字符串,第三个参数为元字符串,第四个参数为可选项,代表最多的替换的次数,如果忽略不写,则会将符合模式的结果全部替换

案例:

pattern = '[a-zA-Z]+://[^\s]*[.com\.cn]'
string='<a href="http://www.baidu.com">百度首页</a>'
result1=re.search(pattern,string)
print(result1)
pattern1=
'\d{4}-\d{7}|\d{3}-\d{8}'
string1='012-6728263653682682265236'
result2=re.search(pattern1,string1)
print(result2)

输出

<_sre.SRE_Match object; span=(9, 29), match='http://www.baidu.com'>

<_sre.SRE_Match object; span=(0, 12), match='012-67282636'>

表达式,学习,正则

手机扫码访问