Python⾼级——正则表达式re模块1.match⽅法
本⽂⾮原创,转⾃:本⽂链接:
python:正则表达式
⼀、什么是正则表达式
正则表达式也叫做匹配模式(Pattern),它由⼀组具有特定含义的字符串组成,通常⽤于匹配和替换⽂本。
正则表达式,是⼀个独⽴的技术,很多编程语⾔⽀持正则表达式处理。
Wiki:正则表达式(英语:Regular Expression、regex或regexp,缩写为RE),也译为正规表⽰法、常规表⽰法,在计算机科学中,是指⼀个⽤来描述或者匹配⼀系列符合某个句法规则的字符串的单个字符串。在很多⽂本编辑器或其他⼯具⾥,正则表达式通常被⽤来检索和/或替换那些符合某个模式的⽂本内容。许多程序设计语⾔都⽀持利⽤正则表达式进⾏字符串操作。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
通常情况下,如果⼀个⽂本中出现了多个匹配,正则表达式返回第⼀个匹配,如果将 global 设置为 true,
则会返回全部匹配;匹配模式是⼤⼩写敏感的,如果设置了 ignore case 为 true,则将忽略⼤⼩写区别。
有时侯正则表达式也简称为表达式、匹配模式或者模式,它们可以互换。这⾥默认 global 和 ignore case 均为 true。
为什么要使⽤正则表达式
在软件开发过程中,经常会涉及到⼤量的关键字等各种字符串的操作,使⽤正则表达式能很⼤程度的简化开发的复杂度和开发的效率,所以在Python中正则表达式在字符串的查询匹配操作中占据很重要的地位
⼆、Python中的re模块
1.Python为了⽅便⼤家对于正则的使⽤,专门为⼤家提供了re模块供我们使⽤。
查看字符串是否是以“lili”开头
import re  # 导⼊re模块
dir(re)  # 查看re模块的⽅法和属性
['A', 'ASCII', 'DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'RegexFlag', '
S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins_
_', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '__ver
sion__', '_alphanum_bytes', '_alphanum_str', '_cache', '_compile', '_compile_repl', '_expand', '_loc
ale', '_pattern_type', '_pickle', '_subx', 'compile', 'copyreg', 'enum', 'error', 'escape', 'findall
', 'finditer', 'fullmatch', 'functools', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_pa
rse', 'sub', 'subn', 'template']
在Python 2.7.12 查看re的⽅法的界⾯
import re  # 导⼊re模块
str = "lili" # 定义⼀个字符串等于lili
python正则表达式不包含#  查看"lili  is  a good girl"是否以lili开头,结果保存到res中
res = re.match(str,"mayun is very good shangren")
# 使⽤up()提取匹配结果,如果是,则返回匹配对象(Match Object),否则返回None,
结果如下:
‘lili'
请看在命令⾏运⾏的例⼦:
注意:re.match( )⽅法匹配的是以xxx开头的字符串,若不是开头的,尽管属于str内,则⽆法匹配。
2.元字符
我们发现,虽然Python为外⾯提供了re模块供我们使⽤,但是功能太弱,远远⽆法满⾜我们的使⽤,所以我们需要继续学习正则的其他知识。
⾸先我们来看看正则的单个字符的匹配是如何完成的。
表1.常⽤的元字符
代码说明
.匹配除换⾏符(\n)以外的任意字符
\w匹配字母或数字或下划线或汉字0-9、a-z、A-Z、_(下划线)、汉字和其他国家的语⾔符号
\W匹配⾮字母或数字或下划线或汉字,跟\w正好相反
\s匹配任意的空⽩符
\S匹配任意⾮空⽩符
\d匹配数字
\D匹配⾮数字
\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束
[]匹配[]中列举的字符
实例如下:
re.match(".","A")                                                                  运⾏结果:<_sre.SRE_Match object; span=(0, 1), match='A'> re.match(".","8")                                                                                  运⾏结果: <_sre.SRE_Match object; span=(0, 1), match='8'> re.match(".","_")                                                                                    运⾏结果:<_sre.SRE_Match object; span=(0, 1), match='_'> re.match(".","liushuaige")                                                                    运⾏结果:<_sre.SRE_Match object; span=(0, 1), match='l'> re.match(".","10086") #注意,只匹配第⼀个字符运⾏结果:<_sre.SRE_Match object; span=(0, 1), match='1'>
re.match(".*","10086”)  # *表⽰匹配0到多个字符运⾏结果:<_sre.SRE_Match object; span=(0, 5), match='10086'>
re.match(".","\n10086") # 注意,在正则中\n(换⾏键是⽆法匹配的)        运⾏结果:⽆
re.match(".","\t10086") #注意,\t为制表符,相当于⼀个字符运⾏结果:<_sre.SRE_Match object; span=(0, 1), match='\t'>
re.match(".....","10086")                                                                          运⾏结果:<_sre.SRE_Match object; span=(0, 5),
match='10086'>
re.match(".*\\bgood\\b.*","today is a good day")                                运⾏结果:<_sre.SRE_Match object; span=(0, 19), match='today is a good day'>
re.match(".*(\\bgood\\b).*","today is a good day").group(1)                运⾏结果:'good'
# 匹配数字
re.match("[123456789]"," 6这个真是⼀个悲伤的故事 ")                        运⾏结果:<_sre.SRE_Match object; span=(0, 1), match='6'>
re.match("[0-9]"," 6这个真是⼀个悲伤的故事 ")                                    运⾏结果:<_sre.SRE_Match object; span=(0, 1), match='6'>
re.match("[a-z]","this is good day")                                                    运⾏结果:<_sre.SRE_Match object; span=(0, 1), match='t'> re.match("[a-z0-9A-Z]"," this is good day")                                        运⾏结果: <_sre.SRE_Match object; span=(0, 1),
match='t'>
re.match("[a-z0-9A-Z王⼩明]","⼩this is good day")                            运⾏结果: <_sre.SRE_Match object; span=(0, 1), match='⼩'>
# 匹配所有中⽂
re.match("[\u4e00-\u9fa5]","⼤幅的发⽣")    #汉字运⾏结果:  <_sre.SRE_Match object; span=(0, 1), match='⼤'>
re.match("我今年5岁了","我今年5岁了")                                                运⾏结果:<_sre.SRE_Match object; span=(0, 6),
match='我今年5岁了'>
re.match("我今年\d岁了","我今年55岁了") # error 因为\d只会匹配⼀个数字运⾏结果:⽆
re.match("我今年\d岁了","我今年55岁了")                                                      运⾏结果:⽆
re.match("\D","我今年55岁了")            #数字运⾏结果:<_sre.SRE_Match object; span=(0, 1),
match='我'>
re.match("\D*","我今年55岁了")              # ⾮数字运⾏结果:<_sre.SRE_Match object; span=(0, 3),
match='我今年'>
re.match("\s","    我今年55岁了")          # 空⽩符运⾏结果:<_sre.SRE_Match object; span=(0, 1),
match=' '>
re.match("\s","\t我今年55岁了")                                                                      运⾏结果:<_sre.SRE_Match object; span=(0, 1),
match='\t'>
re.match("\s","\n我今年55岁了")        #注意*不能匹配\n(换⾏符)运⾏结果:<_sre.SRE_Match object; span=(0, 1),
match='\n'>
re.match("\s","\r我今年55岁了")                                                                      运⾏结果:<_sre.SRE_Match object; span=(0, 1),
match='\r'>
3.字符转义
如果你想查元字符本⾝的话,⽐如你查.,或者*,就出现了问题:你没法指定它们,因为它们会被解释成其它的意思。这时你就必须使⽤\来取消这些字符的特殊意义。因此,你应该使⽤\.和\*。当然,要查\本⾝,你也得⽤\\.
如:c:\\d\\e\\f.txt
re.match("c:\\","c:\\a\\b") # error 报错,因为\\转义后就变成了\了
re.match("c:\\\\","c:\\a\\b") #正确
re.match(r"c:\\","c:\\a\\b") # 正确,在前⾯加“r”表⽰匹配的字符不进⾏转义,以后匹配符不要再写出上⾯的的转义了。
4.重复
在字符串的匹配中,不可避免的会出现重复字符,我们如何进⾏很友好的匹配呢?
表2.常⽤的限定符
代码/语法说明
*重复零次或更多次
+重复⼀次或更多次
重复零次或⼀次
n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次
下⾯是⼀些使⽤重复的例⼦:
Windows\d+匹配Windows后⾯跟1个或更多数字
1[238]\d{9}匹配以13后⾯跟9个数字(中国的⼿机号)
^\w+匹配⼀⾏的第⼀个单词(或整个字符串的第⼀个单词,具体匹配哪个意思得看选项设置)
+和*的差别
re.match("a[0-9]+h$","ah")                        运⾏结果:⽆
re.match("a[0-9]*h$","ah")                          运⾏结果:<_sre.SRE_Match object; span=(0, 2), match='ah'>
re.match("[A-Z][a-z]*","Liujianhong ")                                                        运⾏结果:<_sre.SRE_Match object; span=(0, 11),
match='Liujianhong'>
re.match("[A-Za-z]*","LiuJianhong ")                                                          运⾏结果:<_sre.SRE_Match object; span=(0, 11),
match='LiuJianhong'>
re.match("[A-Z][a-z]*","LiuJianhong ")                                                        运⾏结果:<_sre.SRE_Match object; span=(0, 3), match='Liu'>(因为J是⼤写的)
re.match("[a-zA-Z_]+[\w_]*","LiuJianhong3 ")                                            运⾏结果:<_sre.SRE_Match object; span=(0, 12), match='LiuJianhong3'>
re.match("[0-9]?[\d]","1")                                                                            运⾏结果:<_sre.SRE_Match object; span=(0, 1), match='1'>
re.match("[0-9]?[\d]","111")                                                                        运⾏结果:<_sre.SRE_Match object; span=(0, 2), match='11'>
re.match("a[0-9]?h$","a12456h")                                                                运⾏结果:⽆
re.match("a[0-9]?h$","ah")                                                                          运⾏结果:<_sre.SRE_Match object; span=(0, 2), match='ah'>
re.match("a[0-9]?h$","a3h")                                                                        运⾏结果:<_sre.SRE_Match object; span=(0, 3), match='a3h'>
re.match("\w{5}","1sadfasdf11")                                                                  运⾏结果:<_sre.SRE_Match object; span=(0, 5), match='1sadf'>
re.match("\w{5,}","1sadfasdf11")                                                                运⾏结果:<_sre.SRE_Match object; span=(0, 11), match='1sadfasdf11'>
re.match("\w{5,9}","1sadfasdf11")                                                              运⾏结果:<_sre.SRE_Match object; span=(0, 9), match='1sadfasdf'>
re.match(".*\\bliu\\b","i is liu fas fsa5 662 2a") # 注意为什么使⽤点运⾏结果:<_sre.SRE_Match object; span=(0, 8), match='i is liu'>
re.match(r".*\bliu\b","i is liu fas fsa5 662 2a")  #结果同上运⾏结果:<_sre.SRE_Match object; span=(0, 8), match='i is liu'>
练习:匹配出qikux的邮箱地址,且@之前有4到20为字符,如59127_ljh@qikux
\w{4,20}@qikux\
>>> re.match("\d*","123456")
<re.Match object; span=(0, 6), match='123456'>
>>> re.match("\d+","123456")
<re.Match object; span=(0, 6), match='123456'>
>>> re.match("\d?","123456")
<re.Match object; span=(0, 1), match='1'>
>>> re.match("\d{2}","123456")
<re.Match object; span=(0, 2), match='12'>
>>> re.match("\d{2,}","123456")
<re.Match object; span=(0, 6), match='123456'>
>>> re.match("\d{2,4}","123456")
<re.Match object; span=(0, 4), match='1234'>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。