python-正则表达式

定义

就其本质而言,正则表达式(或 RE)是一种小型的、高度专业化的编程语言,
(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被
编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

二元字符

.   ^   $   *   +   ?   { }   [ ]   |   ( ) \

实例

+           匹配+号前内容1次至无限次
? 匹配?号前内容0次到1次
{m} 匹配前面的内容m次
{m,n} 匹配前面的内容m到n次
*?,+?,??,{m,n}?    前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配

从前面的描述可以看到'*','+'和'*'都是贪婪的,但这也许并不是我们说要的,
所以,可以在后面加个问号,将策略改为非贪婪,只匹配尽量少的RE。示例,

1  print(re.findall(r"a(\d+?)","a23b")) # 非贪婪模式
2  >>>['2']
3 print( re.findall(r"a(\d+)","a23b"))
4 >>> ['23']

\:
反斜杠后边跟元字符去除特殊功能,
反斜杠后边跟普通字符实现特殊功能。
引用序号对应的字组所匹配的字符串

1 #search查找匹配字符的起始位置与终止位置
2 n=re.search(r"(alex)(eric)com\2","alexericcomeric")
3 print(n.span())
4 >>>(0, 15)

\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b: 匹配一个单词边界,也就是指单词和空格间的位置。
匹配单词边界(包括开始和结束),这里的“单词”,是指连续的字母、数字和
下划线组成的字符串。注意,\b的定义是\w和\W的交界,
这是个零宽界定符(zero-width assertions)只用以匹配单词的词首和词尾。
单词被定义为一个字母数字序列,因此词尾就是用空白符或非字母数字符来标
示的。

 

1 print( re.findall(r"abc\b","dzx &abc sdsadasabcasdsadasdabcasdsa"))
2 >>>['abc']
3 print( re.findall(r"\babc\b","dzx &abc sdsadasabcasdsadasdabcasdsa"))
4 >>>['abc']
5 print( re.findall(r"\babc\b","dzx sabc sdsadasabcasdsadasdabcasdsa"))
6 >>>[]

注意:
re.match('com', 'comwww.runcomoob')
re.search('\dcom', 'www.4comrunoob.5com')
一旦匹配成功,就是一个match object 对象,而match object 对象拥有以下方法:
group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置
group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。

1. group()返回re整体匹配的字符串,
2. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
3.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到
所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则
表达式中定义的组。

1 import re
2 a = "123abc456"
3 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0) #123abc456,返回整体
4 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1) 
5 >>>[123]
6 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2) 
7 >>>[abc]
8 re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)
9 >>>[456]

group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3)
列出第三个括号匹配部分。

#re.findall  以列表形式返回所有匹配的字符串
#re.findall可以获取字符串中所有匹配的字符串。如:
p = re.compile(r'\d+')
print(p.findall('one1two2three3four4'))
>>>['1', '2', '3', '4']
#获取字符串中,包含'oo'的所有非字符单词
text = 'djks#dooljsdJ('
print(re.findall(r'\w*oo\w*', text))
>>>['dooljsdJ']
#以数字分割字符串
p = re.compile(r'\d+')
print(p.split('one1two2three3four4'))
>>>['one', 'two', 'three', 'four', '']
#等同于
print(re.split('\d+','one1two2three3four4'))
>>>['one', 'two', 'three', 'four', '']
1 a = 'abc123abv23456'
2 b = re.findall(r'23(a)?',a)
3 print(b)
4 >>>['a', '']
5 #匹配23后面为任意一个字符
6 b = re.findall(r'23(?:a)?',a)
7 print(b)
8 >>>['23a', '23']

 

posted @ 2016-06-13 23:04  ppppppy  阅读(195)  评论(0编辑  收藏  举报