python正则表达式详解(一):元字符及分组

python正则表达式详解

说明:

关于内容:每个知识点尽量用简明方式表述,同时用示例说明,方便以后查阅,方便理解

关于访问:为避免浪费某些同学的时间,先列出所有的内容提要,如果符合要求,则请继续阅读,如果不符合要求,则可以离开。

关于权限:   仅用于学习与分享,转载主注明出处。

内容提要:

一、正则表达式

1.1 对正则表达式的理解及python中正则使用的基本方法

1.1.1对正则表达式的理解

1.1.2python中正则表达式的基本使用方法

1.2 python正则表达式中的元字符

1.2.1-13:".","^","$","*","+","?","*?,+?,??","{m}","{m,n}","{m,n}?","\\","[]","|"

1.3 python正则中的分组

1.3.1-10:(...)(?aiLmsux)(?:...)(?P<name>...)(?P=name)(?#...)(?=...)(?!...)(?<=...)(?<!...)

(?(id/name)yes|no)

--------------------------------------------------------------------------以下为正文--------------------------------------------------------------

一、正则表达式

1.1 对正则表达式的理解及python中正则使用的基本方法

1.1.1对正则表达式的理解

正则表达式由普通文本字符和特殊字符(元字符)两种字符组成的一系列的字符串的模式,。元字符在正则表达式中具有特殊意义,它让正则表达式具有更丰富的表达能力。例如,正则表达式 r"a.d"中 ,字符 ‘a’ 和 ‘d’ 是普通字符,’.’ 是元字符,. 可以指代任意字符,它能匹配 ‘a1d’、’a2d’、’acd’等。

1.1.2python中正则表达式的基本使用方法

在Python中,利用re模块处理正则表达式,如下代码:

import re

#字符串1
regx_string='aab'

#字符串2
regx_string2='anb'

#生成一个匹配的正则表达式对象
pattern=re.compile('a.b')

#匹配字符串1
m1=pattern.match(regx_string)

print(m1)
# <_sre.SRE_Match object; span=(0, 3), match='aab'>

#匹配字符串2
m2=pattern.match(regx_string2)

print(m2)
# <_sre.SRE_Match object; span=(0, 3), match='anb'>

#字符串3
regx_string3='and'

m3=pattern.match(regx_string3)

print(m3)
# None

说明:match方法在字符串与正则表达式匹配的时候,返回的是一个Match对象,如果不匹配,则返回的是None

  python中另一种使用正则的方法:

# match(pattern, string, flags=0)
m4=re.match('a.b',regx_string)

print(m4)
# <_sre.SRE_Match object; span=(0, 3), match='aab'>

1.2 python正则表达式中的元字符

1.2.1:"."

 "."      匹配除换行符之外的任何字符:字母、数字、符号、空白字符.

#示例:
print(re.match('.a.c.','*a1c '))
# <_sre.SRE_Match object; span=(0, 5), match='*a1c '>

print(re.match('.a.c.','*a1c\n'))
# None

1.2.2:"^"

"^"      表示匹配字符串的开头

#示例:
#匹配一个以ab开关的字符串
print(re.match('^ab.*','abccd$#2'))
# <_sre.SRE_Match object; span=(0, 8), match='abccd$#2'>

#匹配一个以ac开关的字符串
print(re.match('^ac.*','abccd$#2'))
# None

1.2.3:"$"

"$"  匹配字符串的末尾或字符串末尾的换行符之前

#示例:
#匹配一个ac结尾的字符串:
print(re.match('.*ac$','adsfasdfac'))
# <_sre.SRE_Match object; span=(0, 10), match='adsfasdfac'>

#看结束点
print(re.match('.*ac$','adsfacdfac\n'))
# <_sre.SRE_Match object; span=(0, 10), match='adsfacdfac'>

print(re.match('.*ac$','adsfac\ndfac'))
# None

说明:$是一般情况下匹配一行的末尾,如果是多行,则没法进行匹配。但可以进行专门指定匹配多行

print(re.match('.*ac$','adsfac\ndfac',re.M))
# <_sre.SRE_Match object; span=(0, 6), match='adsfac'>,这种情况相当于没有指定多行的情况下直接匹配'adsfac'

1.2.4 "*"

 "*"      重复匹配零次或者更多次(贪婪模式).
贪婪模式:尽可能多的匹配遇到的重复。

#示例如下:
#匹配一个以a开始,以b结束的字符串
print(re.match('a.*b','aaaadbdgdbddf546b'))
#<_sre.SRE_Match object; span=(0, 17), match='aaaadbdgdbddf546b'>

#限制贪婪模式
print(re.match('a.*?b','aaaadbdgdbddf546b'))
#<_sre.SRE_Match object; span=(0, 6), match='aaaadb'>

1.2.5 "+"

"+"  重复匹配1次或者更多次(贪婪模式)

示例:分别用*和+匹配一个以含有'ab'的字符串
#匹配字符串:aaabcdbfdd

print(re.match('^.*(ab)*.*$','aaabcdbfdd'))
# <_sre.SRE_Match object; span=(0, 10), match='aaabcdbfdd'>

print(re.match('^.*(ab)+.*$','aaabcdbfdd'))
# <_sre.SRE_Match object; span=(0, 9), match='aaadcdfbb'>

#匹配字符串:aaadcdfcc

print(re.match('^.*(ab)*.*$','aaadcdfcc'))
# <_sre.SRE_Match object; span=(0, 9), match='aaadcdfcc'>

print(re.match('^.*(ab)+.*$','aaadcdfbb'))
# None

1.2.6 "?"

"?"      重复匹配0次或者1次(贪婪模式).

#示例:分别用aaabcdbfdd和aaadcdfbb匹配正则表达式'^.*ab?.*$'

print(re.match('^.*(ab)?.*$','aaabcdbfdd'))
# <_sre.SRE_Match object; span=(0, 10), match='aaabcdbfdd'>

print(re.match('^.*(ab)?.*$','aaadcdfbb'))
# <_sre.SRE_Match object; span=(0, 9), match='aaadcdfbb'>

1.2.7 "*?,+?,??"

*?,+?,??    *,+,?的非贪婪模式.

# 示例:正则表达式:'(ab)*','(ab)*?','(ab)+','(ab)+?','(ab)?','(ab)??',匹配字符串:ababababababababab
#说明:Match对象的group方法在参数为零的情况下,返回的是整个匹配的字符串
print(re.match('(ab)*','ababababababababab').group())
# ababababababababab

print(re.match('(ab)*?','ababababababababab').group())
# ''0个

print(re.match('(ab)+','ababababababababab').group())
# ababababababababab

print(re.match('(ab)+?','ababababababababab').group())
# ab

print(re.match('(ab)?','ababababababababab').group())
# ab

print(re.match('(ab)??','ababababababababab').group())
# ''0个

1.2.8  "{m}"

"{m}"  重复匹配m次

1.2.9  "{m,n}"

{m,n}    重复匹配m次或者n次(贪婪模式)

1.2.10  "{m,n}?"

{m,n}?   {m,n}的非贪婪模式.

#示例:正则表达式:'(ab){1,3}','(ab){2,5}','(ab){1,3}?','(ab){2,5}?',匹配字符串:ababababababababab
print(re.match('(ab){1,3}','ababababababababab').group())
# ababab

print(re.match('(ab){1,3}?','ababababababababab').group())
# ab

print(re.match('(ab){2,5}','ababababababababab').group())
# ababababab

print(re.match('(ab){2,5}?','ababababababababab').group())
# abab

1.2.11  "\\"

"\\"     转义特殊字符或表示特殊序列

#示例:转义特殊字符-->匹配.+?*\

print(re.match('.+?*','.+?*').group())
# sre_constants.error: multiple repeat at position 3

说明:该错误说明我们在表达式中使用了多个表示重复功能的元字符,而不是我们原先设想的表示字符串“.+?*\”

print(re.match('\.\+\?\*','.+?*').group())
# .+?*

# 表示特殊序列:\d 表示所有的数字,\w表示所有的字母数字

print(re.match('\d*','25*29').group())
# 25

print(re.match('\w+','1134afdads').group())
# 1134afdads

1.2.13  "[]"

[]       表示一组字符,如果以"^"为第一个字符,表示一组字符的互补集.

# 示例:匹配一个含有1-5的字符串
print(re.match('[12345]+','1235425422119877').group())
# 123542542211

print(re.match('[1-5]+','1235425422119877').group())
# 123542542211

#匹配除了abc以外的所有字符
print(re.match('[^abc]+','155acdefafdf').group())
# 155

1.2.13  "|"

"|"      A|B, 选择分支,或者匹配A或者匹配B.

# 示例:匹配由[a-z]的小写字母或[2-9]的数字组成的字符串

print(re.match('[a-z]+|[2-9]+','abcdefga').group())
# abcdefga

print(re.match('[a-z]+|[2-9]+','32456546545').group())
# 32456546545

print(re.match('[a-z]+|[2-9]+','adfasf32456546545').group())
# adfasf

print(re.match('[a-z]+|[2-9]+','2356safdsfa').group())
# 2356

print(re.match('[a-z]+|[2-9]+','12356safdsfa'))
# None

1.3 python正则中的分组

1.3.1:(...)

(...)       匹配一个分组,将括号中的内容当作一个整体来对待

# 示例:
print(re.match('ab*','abbb').group())
# abbb

print(re.match('(ab)*','abbb').group())
# ab

1.3.2:(?aiLmsux)

(?aiLmsux)    为表达式设置 A, I, L, M, S, U, 或 X 标志.标志的具体含义,会在后面的内容中详细解读

#示例:I标志表示大小写不敏感匹配如下

print(re.match('[A-Z]+','acdadsfadf'))
# None

print(re.match('[A-Z]+(?i)','acdadsfadf'))
# <_sre.SRE_Match object; span=(0, 10), match='acdadsfadf'>

#也可以这样进行设置
print(re.match('[A-Z]+','acdadsfadf',re.I))
# <_sre.SRE_Match object; span=(0, 10), match='acdadsfadf'>

1.3.3:(?:...)

 (?:...)     非分组模式的分组匹配

#示例:
print(re.match('(?:\w+) (?:\w+)','Eric Brown').group())
# Eric Brown

# print(re.match('(?:\w+) (?:\w+)','Eric Brown').group(1))
# IndexError: no such group

print(re.match('(\w+) (\w+)','Eric Brown').group())
# Eric Brown

print(re.match('(\w+) (\w+)','Eric Brown').group(1))
# Eric 

print(re.match('(\w+) (\w+)','Eric Brown').group(2))
# Brown

说明:在非分组模式下,字符串的匹配只会将整个的匹配结果返回,而对于表达式中每一个组的匹配情况则不会进行保存.
而在分组模式下,不但保存了整个分组的匹配结果,也将表达式中每一个组的匹配结果分开保存,关于Match对象的分组,后面有内容会进行详细介绍

 

1.3.4:(?P<name>...)

(?P<name>...)  组匹配的子字符串,可以能一个名称访问.

# 示例:
print(re.match('(?P<first_name>\w+) (?P<last_name>\w+)','Eric Brown').group())
# Eric Brown

print(re.match('(?P<first_name>\w+) (?P<last_name>\w+)','Eric Brown').group('first_name'))
# Eric

print(re.match('(?P<first_name>\w+) (?P<last_name>\w+)','Eric Brown').group('last_name'))
# Brown

1.3.5:(?P=name)

(?P=name)     对指定的组反向的引用,以前面的以name为名称的组匹配的文本为分组内容,匹配后面的内容

#示例:
pattern=re.compile('(?P<number>[1-9]){5}@(?P<letters>[a-z])+\.(?P=letters)+')

m=pattern.match('12345@qq.qq')

print(m.group())
# 12345@qq.qq

print(m.group(1))
# 5

print(m.group(2))
# q

1.3.6:(?=...)

(?=...)  当该表达式匹配成功的时候,它的前面的表达式才会匹配.

#示例:

print(re.match('\w+@(?=\d+)','abcds@123456').group())
# abcds@

说明:上面表达式的表示:在@后面必然跟的是数字,如果不是,则字符串不符合要求,如果是,匹配返回的内容则是前面的字符串与@

1.3.6:(?!...)

(?!...)   当该表达式不匹配的时候,它的前面的表达式都会匹配成功

#示例:
print(re.match('\w+@(?!\d+)','abcds@dfa').group())
# abcds@

1.3.7:(?<=...)

(?<=...) 匹配以...开始的后面部分的字串,只能是固定的长度,也就是一个明确的表达式.

#示例:
print(re.match('(?<=abc)def', 'abcdef'))
#None

print(re.search('(?<=abc)def', 'abcdef'))
#<_sre.SRE_Match object; span=(3, 6), match='def'>

说明:该模式不能于一个字符串的开始

print(re.match('(\w+)(?<=zhang)san', 'myzhangsan').group())
# myzhangsan

1.3.8:(?<!...)

(?<!...)   匹配不是以...开始的后面部分的字串.只能是固定的长度

print(re.match('(\w+)(?<!zhang)san', 'mylisan').group())
# mylisan

1.3.9:(?(id/name)yes|no)

(?(id/name)yes|no) 如果前面以id/name表示的正则匹配,则利用yes处的正则表达式匹配后面的字符串,否则用no处的匹配,

#示例:
#下面的例子检查的是一个字符串两边的括号是否配对,如果没有括号或配对,则匹配成功,否则将匹配失败。
pattern=re.compile('(?P<lefg_bracket>\()?\w+(?(lefg_bracket)\)|$)')

#两边有括号
m=pattern.match('(ab123456)')

print(m.group())
# (ab123456)

#两边没有括号
m=pattern.match('cdefghj')

print(m.group())
# cdefghj

#一边有括号
m=pattern.match('(abdcd')

print(m)
# None

-----------------------------------------------------------------------------------------正文结束------------------------------------------------------------------

 

 

  • 24
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值