标签:
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