首页 > 代码库 > day5模块学习--re正则模块
day5模块学习--re正则模块
1. 正则表达式基础
1.1. 简单介绍
正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。
下图展示了使用正则表达式进行匹配的流程: http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符比较,如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。如果表达式中有量词或边界,这个过程会稍微有一些不同,但也是很好理解的,看下图中的示例以及自己多使用几次就能明白。
下图列出了Python支持的正则表达式元字符和语法:
1.”.“匹配任意除换行符以外的字符
>>> string = "abafsdafd\nafdasfd" #包含换行符
>>> string1 = "adfasdfadfasdfwer12345656耿" #不包含换行符
>>> import re
>>> m = re.search(".+",string) #验证是否可以匹配换行符
>>> m.group()
‘abafsdafd‘
>>> n = re.search(".+",string1)
>>> n.group()
‘adfasdfadfasdfwer12345656耿‘
从上面输出结果可以看出,”.“是匹配任意除了换行符的字符。遇到"\n"换行符即终止匹配。
2.”\"转义字符
转义字符,使后一个字符改变原来的意思。如果字符串中有*号需要匹配,可以使用\*或者字符集[*],"a\.c"代表匹配a.c "a\\c"代表匹配a\c
>>> str_num = "22.567979mafdasdf"
>>> m = re.search("\d+\.\d+",str_num)
>>> m.group()
‘22.567979‘
我们知道,"."在python中代表的含义是除了"\n"之外的所有字符,如果这里不进行转义的话,匹配出来的就是任意非"\n"字符,因此要使用"\"进行转义。
>>> string = "dfafdasfd\fafdasfda"
>>> string
‘dfafdasfd\x0cafdasfda‘
在python中,如果字符串中包含"\",有时候会显示不出来,或者修改后面的内容,把别人改变了,这个不知道在Linux平台上是怎么回事。
3.[...]字符集(字符类)
[...]:字符集(字符类)对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出[0,1,2,3,4,5,6,7,8,9],也可以给出范围[0-9]。第一个字符集如果是^表示取反,如[^abc]表示不是abc的其他字符。
所有的特殊字符在字符集中都失去其原有的特殊意义。在字符集中如果要使用]、或^,可以在前面加上"\"反斜杠,或把]\、-放在第一个字符,把^放在非第一个字符。
>>> string = "dafdafdasf[adfas^fad"
>>> m = re.search("[a-z]+\[",string)
>>> m.group()
‘dafdafdasf[‘
从上面脚本可以看出,如果要匹配[要在前面加上"\"转义字符。
>>> m = re.search("\w+[[]",string) (1)在字符集中匹配"["
>>> m.group()
‘dafdafdasf[‘
>>> n = re.search("w+[\[]",string) (2)转义匹配,验证在字符集中匹配[是否需要加[\]
>>> n.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ‘NoneType‘ object has no attribute ‘group‘
在字符集中如果要使用]、或^,可以在前面加上"\"反斜杠,或把]\、-放在第一个字符,把^放在非第一个字符。
预定义字符集
1.\d数字
>>> m = re.search("\d",string)
>>> m.group()
‘1‘
\d是匹配数字,等价于[0-9]
2.\D非数字 等价于[^\d]
>>> string = "dfaMNA12581耿fa"
>>> m = re.search("\D",string)
>>> m.group()
‘d‘
>>> n = re.search("[^\d]",string)
>>> n.group()
‘d‘
>>> l = re.search("[^0-9]",string)
>>> l.group()
‘d‘
从上面可以看出,“\D”是用来匹配非数字的,匹配除了数字0-9意外的任意字符,等价于[^0-9]或[^\d]
3.\s空白字符 [<空格>\r\t\n\f\v]
“\s”是匹配任意非空字符,如[<空格>\r\t\n\f\v]等,实例如下:
>>> m = re.search("\s+",string) #\s进行匹配空白字符
>>> m.group()
‘ \t \n \x0c \x0b \r‘
从上面可以看出,\s是匹配任意空白字符,如空格、\r、\t、\n、\f、\v等
4.\S非空白字符 \S与\s正好相反,是匹配任意非空字符。等价于[^\s]匹配任意非空字符
>>> string = "faMM耿 \t \n \f \v \rDASDF"
>>> n = re.search("\S+",string)
>>> n.group()
‘faMM耿‘
从上面可以看出"\S"是匹配任意非空字符,遇到空的字符即停止了,匹配任意非空字符,"."匹配任意字符,除了换行符之外。
>>> m = re.search(".+",string)
>>> m.group()
‘faMM耿 \t ‘
从上面看出,“\S”和“.”还是有差别的,一个是任意非空字符,一个是匹配任意除了"\n"意外任意非空字符。
5.\w 单词字符[A-Z0-9a-z_]
\w是匹配单词字符,下面来看下能不能匹配汉字或其他:
>>> string = "faMM耿 \t \n \f \v \rDASDF"
>>> m = re.search("\w+",string)
>>> m.group()
‘faMM耿‘ (1)脚本
>>> format_string = "fdMM更KKMM长 /大MM \n \tMMKDSI"
>>> m = re.search("\w+",format_string)
>>> m.group()
‘fdMM更KKMM长‘ (2)脚本
可以看出,"\w"是可以匹配汉字的,不能匹配空格,换行符这些,但是能够匹配汉字。
6.
day5模块学习--re正则模块