码迷,mamicode.com
首页 > 编程语言 > 详细

python自动化开发学习【第六天】

时间:2016-06-18 00:03:46      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:

import  re   # 正则只能匹配字符串
 
通配符:
  • .      可以匹配任何字符(除了换行符),只能匹配一个字符
  • \      反斜杠,转义字符
  • ^     开头符号需要转义,匹配字符串的开始,也可以是否定运算符不许转义
  • $      匹配字符串的结束
  • \w    匹配字母或数字或下划线或汉字
  • \W   匹配非字母数字
  • \s     匹配任意的空白符 ,等价于[\t\n\r\f]
  • \S    匹配任意非空字符
  • \d    匹配数字
  • \D    匹配任意服数字
  • \A    匹配字符串开始
  • \Z    匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
  • \z     匹配字符串结束
  • \G    匹配最后匹配完成的位置
  • \b    匹配单词的开始或结束
  • |      选择项字符,或的意思
  • *     允许重复0次或者多次
  • +    允许重复1次或者多次
  • ?     出现一次或者根本不出现
  • { m , n }    重复m~n次
  • { m }        重复m次
  • { m , }      重复m次或更多次
  • ()        小括号是为了提取匹配的字符串,表达式中有几个小括号就有几个相应的匹配字符串
  • (\s*)   表示连续空格的字符串
  • []中括号表示定义匹配的字符范围,[a-zA-Z0-9]表示匹配字母和数字,[\s*]表示空格或者*号
 
(0-9) 匹配‘0-9’本身
[ 0-9 ]*  匹配数字(注意有*,可以为空)
[ 0-9 ]+ 匹配数字(注意有+,不可以为空)
{ 1-9 }  大括号中,错误的写法
[ 0- 9]{0,9} 表示长度为0到9的数字字符串
 
 
 
match  
match(pattern,string,flags=0)
# pattern: 正则模型
# string : 要匹配的字符串
# flags :   匹配模式
     match方法会在给定的字符串的开头进行匹配,如果匹配不成功则返回None,匹配成功返回一个匹配对象,这个对象可以使用group方法,可以将匹配到的字符串给出。
>>> ret = re.match(r"abc","ab1c123")    # 从头开始匹配
>>> print(ret)                                          # 直接打印为None
None
>>> re.match(r"abc","abc123")
<_sre.SRE_Match object; span=(0, 3), match=‘abc‘>  #span指的是匹配到的字符在字符串中的位置下标,分别对应start和end,不包括end
>>> obj = re.match(r"abc","abc123")       
>>> obj.group()                                      # 通过 group()方法返回匹配到的值
‘abc‘
>>> obj = re.match(r"abc","abc123")
>>> obj.start()
0
>>> obj.end()
3
>>> obj.span()
(0, 3)
>>> obj.group()
‘abc‘
 
search
search(pattern, string, flags=0)
     search方法是在字符串内查找模式,返回第一个匹配都的字符串。如果匹配不成功则返回None,匹配成功返回一个匹配对象,这个对象可以使用group方法,可以将匹配到的字符串给出。
>>> obj = re.search(r"abc","123abc456abc789")
>>> obj
<_sre.SRE_Match object; span=(3, 6), match=‘abc‘>
>>> obj.group()       # 和match 一样同样有group()方法,返回匹配到的字符串
‘abc‘
>>> obj.start()
3
>>> obj.end()
6
>>> obj.span()
(3, 6)
 
findall
findall(pattern,string,flags=0)
     findall和match,search的不同之处在于,前两者都是单值匹配,而它是全部匹配,它的返回值是一个匹配到字符串的列表
如果没有匹配到对象,那么就返回一个空列表,所有findall是没有group方法的,也没有start,end,span.
 
>>> obj = re.findall(r"abc","123abc456abc789")
>>> obj
[‘abc‘, ‘abc‘]           # 返回值是一个列表,列表中包含所匹配到的字符串
>>> obj.group()   # 不存在group方法
Traceback (most recent call last):
  File "<pyshell#37>", line 1, in <module>
    obj.group()
AttributeError: ‘list‘ object has no attribute ‘group‘
>>> obj = re.findall(r"ABC","123abc456abc789")
>>> print(obj)      # 如果没有匹配到字符串,则返回一个空列表
[]
 
split
split(pattern, string, maxsplit=0, flags=0)
# pattern : 正则模型
# string : 要匹配的字符串
# maxsplit : 指定分割个数
# flags : 匹配模式
     split函数和字符串类型的split方法很相似,都是利用特定的字符去分隔字符串。但re模块的split可以使用正则表达式,因此更加灵活,
更加强大。
>>> s = "8+7*5+6/3"               
>>> tmp = re.split(r"[\+\-\*\/]",s)         # 匹配模式是加减乘除四个运算符中的任何一种,通过split将字符串分隔成一个一个数字
>>> tmp
[‘8‘, ‘7‘, ‘5‘, ‘6‘, ‘3‘]
     split有个参数maxsplit,用于指定分割的次数
>>> tmp = re.split(r"[\+\-\*\/]",s, maxsplit = 2)
>>> tmp
[‘8‘, ‘7‘, ‘5+6/3‘] 
     利用分组的概念,split函数还可以保存被匹配到的分隔符,这个功能很重要。
>>> tmp = re.split(r"([\+\-\*\/])",s)
>>> tmp
[‘8‘, ‘+‘, ‘7‘, ‘*‘, ‘5‘, ‘+‘, ‘6‘, ‘/‘, ‘3‘]
 
sub
sub(pattern,repl,string,count=0,flags=0)
# pattern : 正则模型
# repl : 要替换的字符串或可执行对象
# string : 要匹配的字符串
# count:指定匹配个数
# flags : 匹配模式 
     sub函数类似字符串的replace功能,用指定的内容替换匹配到的字符,可以指定替换的次数。
>>> s = "hello world, i am pythoner!"
>>> s = re.sub(r"o","X",s)   # 将字符串s 中的“o”替换为 “X”
>>> s
‘hellX wXrld, i am pythXner!‘
     sub 函数有一个高级用法,“分组引用“:首先在正则表达式里用括号建立了一个分组,然后在要替换进去的字符串里引用“\1”引用这个分组匹配到的内容,
>>> r = re.sub(r"(world)", r"<em>\1<em>", s)   
>>> r
‘hello <em>world<em>, i am pythoner!‘
 >>> r = re.sub(r"(world)", r"%%%%\1%%%%%", s)
>>> r
‘hello %%%%world%%%%%, i am pythoner! 
 
flag
     python的re模块为其主要的函数都设计了flag参数,被称为编译标志,比如 I , M, S等。编译标志可以修改正则表达式的一些运行方式,
可以使用全名如:IGNORECASE, 或缩写如I来引用他们。多个标志可以组合,如re.I | re.M 被设置成I 和 M 标志。
  • I (忽略大小写) IGNOGRECASE:   不区分大小写匹配
  • L(本地模式)     LOCALE : 使得\w, \W, \b, \B, \d, \D 依赖于本地设置
  • M(多行模式)   MULTILINE : 让正则表达式的 ^和$ 符号可以适应多行模式的字符串
 
例如字符串 s = "\nabc\n" 实际上它有三行
>>> import re
>>> s = "\nabc\n"
>>> re.search(r"^abc$",s)
>>>
>>> re.search(r"abc$",s)
<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>       
>>> re.search(r"^abc",s)
>>>
>>> re.search(r"abc",s)
<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>
>>>
>>> re.search(r"^abc$",s,re.M)
<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>
>>>
>>> re.search(r"^abc",s,re.M)
<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>
>>>
>>> re.search(r"abc$",s,re.M)
<_sre.SRE_Match object; span=(1, 4), match=‘abc‘>
  • S (匹配换行符)
  • DOTALL : 使“ . ”特殊字符完全匹配任何字符,包括换行,如果没有这个标志,"." 只能匹配出换行符外的任何字符
  • X (注释模式)
  • VERBOSE:当该标志被指定时,在正则表达式字符串中的空白,tab, 换行符被忽略,除非该空白符在字符类中或在反斜杠之后;这可以让你更清晰的组织和缩进表达式。它允许你将注释写入表达式,这些注释会被引擎忽略;注释用“#”号来表示,不过该符号不能在字符串或反斜杠之后。它的作用:一是让复杂难懂的表达式更易读,二十给表达式加注释。
     下面的pat等同于r"\*([^\*]+)\*"
>>> pat = re.compile(r‘‘‘
                                \*           #  转义一个星号
                                (             # 左括号代表一个 组的开始
                                [^\*]+    # 捕获任何非星号的字符
                                )             # 右括号代表组的结束
                                \*           #  转义一个星号
                                ‘‘‘,re.VERBOSE)
 
>>> obj = pat.search("hi ,this is a  *something* !")
>>> obj.group()
‘*something*‘
  • U  UNICODE:兼容模式。在字符串模式下被忽略(默认模式),在字节模式下被禁止。在python3之后,string和bytes被独立成两种不同的数据类型。在re模块中,不能用Bytes去匹配string或者用string匹配bytes,只能用string匹配string,bytes匹配bytes。
import re
 
s = "halo"
b = bytes(s, encoding="utf-8")
pat = bytes(‘ha‘, encoding="utf-8")
print("字符串s:%s" % s)
print("字节b:%s" % b)
print("字节类型正则表达式pat:%s" % pat)
obj_s = re.search(pat, b)
print("匹配结果: %s" % obj_s.group())
 
运行结果:
 
字符串s:halo
字节b:b‘halo‘
字节类型正则表达式pat:b‘ha‘
匹配结果: b‘ha 
     当使用UNICODE模式时,将强制禁止使用bytes类型,一旦使用将报错。在string类型中,UNICODE是默认设置。
  • A  ASCII:对于string模式,使得\w, \W, \b, \B, \d, \D 只匹配ACSII码字符集,而不是整个UNICODE字符集(默认)。对于bytes模式,这个编译标志是默认设置,不需要特别指定。通常我们不关心这个些,但是对于那些频繁在各种语言或字符串打交道的代码就要小心了。
 

 

python自动化开发学习【第六天】

标签:

原文地址:http://www.cnblogs.com/wang-yc/p/5591299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!