正则表达式

三个查找  

findall 查找所有匹配的字符  如果有组则会优先只抓去组内的字符

import re

p = refindall("www.(baidu|google).com","www.baidu.com")

print(p)
#此时结果为["baidu"]

 如果findall查找的条件是“”字符串的话,那么结果为比查找的字符串多一位。

import re
p = re.findall('','lichao')
print(p)

#结果为 ['','','','','','','']

 

 import re
 f = "hello alex"
 p = re.findall("(a)(\w+(e))(x)",f)
 print(p) 
#按括号的层级一级一级提取,从外到内,从左到右,第一次执行最外层括号,所以提取a,le,,第二次执行括号里面的提取,提取e,第三次提取x 所以结果是 a le e x 。如果再加括号还是相同道理。
import re
f = "hello alex"
p = re.findall("(a)((\w+)(e))(x)",f)
print(p)
#结果为 第一层括号那出a,le,第二层括号拿出,l,e,第三次拿出x。所以结果为 a le l e x。另外在findall 中加?P<>也是不起作用的。

 

finditer 与findall的区别是一个返回数组,一个返回迭代器。

import re

p = re.compile(r'\d+')

w = p.finditer('12 drumm44ers drumming,11...10...')

for match in w:
    print(match.group(),match.span())
# 结果为  
12 (0, 2)
44 (8, 10)
11 (23, 25)
10 (28, 30)
import re
f = "hello alex"
p = re.finditer("(a)((\w+)(e))(?P<n1>x)",f)
for i in p :
    print(i.group(),i.groups(),i.groupdict())

#对于可迭代的finditer拿字符就需要用循环语句了。alex ('a', 'le', 'l', 'e', 'x') {'n1': 'x'}

 

search查找到第一个匹配的字符,如果没有返回none,如果group则报错。

import re
ppp = "hello alex i am 19"
r = re.search('a(\w+).*(?P<name>\d)$',ppp)
print(r.group()) # 输出全部字符 
print(r.groups()) # 输出 ('lex', '9')
print(r.groupdict()) # 输出 {"name" :"9"}
group 输出符合的所有 加s是输出组 dict输出字典。

 

 

match查找开头的匹配字符,如果没有返回none,如果group则报错。

 

两个替换

sub 替换 第一个是要替换的字符串,第一个是更换后的条件,第三个是要更换的字符串,第四位是换几次。

import re
p = re.sub("p","re","pppoee")
print(p)

#结果为rerereoee
import re
p = re.sub("p","re","pppoee",2)
print(p)
#结果是rerepoee

subn 就是多了一个条件,多返回一个替换的次数。

import re
p = re.subn("p","re","pppoee",)
print(p)
#('rerereoee', 3)

 

一个分割 split

compile 定义一个查找规则 

import re
p = re.compile(r"\d")
text = "lichao123"
w = p.findall(text)
print(w)
#结果为['1','2','3']
import re
p = re.compile(r"\d")
text = "lichao123"
w = re.findall(p,text)
print(w)

 

元字符

\d      斜杠符匹配所有数字,[0-9].

import re
p = re.findall('\d','123 qqQ Q ')
print(p)
#结果为['1', '2', '3']

\D     匹配所有非数字, [^0-9].

import re
p = re.findall('\D','123 qqQ Q ')
print(p)
#结果为[' ', 'q', 'q', 'Q', ' ', 'Q', ' ']

\s      匹配所有空字符,空格TAB []

import re
p = re.findall('\s','123 qqQ Q ')
print(p)
#[' ', ' ', ' ']

\S     匹配所有非空字符,

import re
p = re.findall('\S','123 qqQ Q ')
print(p)
#['1', '2', '3', 'q', 'q', 'Q', 'Q']

\w     匹配所有数字及字母,[aA-zZ0-9]

import re
p = re.findall('\w','123qqQQ ')
print(p)
#输出结果为['1','2','3','q','q','Q','Q']

\W    匹配所有非数字及字母,[^aA-zZ0-9]

import re
p = re.findall('\W','123 qqQ Q ')
print(p)
#输出结果为[' ',' ',' ']

\b  边界。指空白符或标点等等。

 \2   那么如果在条件里则重复第2组。

import re
p = re.findall(r'(alex)(tom)(lichao)\2','alextomlichoatom')
print(p)
# 输出为[('alex','tom','lichao')]

import re

p = re.search(r'(alex)(tom)(lichao)\2',alextomlichaotom).group()

print(p)
#alextomlichaotom

 

. 点 通配符,表示通配所有的字符。

import re
p = re.findall('a.d','acd''aed')
print(p)
#结果为['acd' 'aed']

*   星号重复0次或多次 

import re
p = re.findall('alex*','alexxxxxx')
print(p)
#*会一直重复条件最后一位的0次会多次,也就是说如果字符串是ale也可以输出,但是同样的条件+号不行因为至少有依次。

import re

p = re.findall('alex*','ale')
print(p)
#输出结果为ale

+  加号重复1次或多次

import re
p = re.findall('alex+','alexxxxxx')
print(p)
#如果是加号则输出1次或多次,结果为alexxxxxx。

import re
p = re.findall('alex+','ale')
print(p)
#因为找不到字符,输出空列表[],所以+号代表至少得有一次。

? 重复0到1次

import re
p = re.findall('alex?','alexxxxxx')
print(p)
#如果是?则是找到0-1次的结果,如果有就输出"alex'

import re
p = re.findall('alex?','ale')
print(p)
#如果没有就显示‘ale’。

+? 匹配一次的

import re

p = re.findall('alex+?','alexx')

print(p)

#输出alex 如果匹配ale 则输出空列表[]。

*?  匹配0到1次 等同于 一个问号的作用

import re

p = re.findall('alex*?','alexxxx')

print(p)

#结果是alex 

p = re.findall('alex*?','ale')
print(p)

#结果为ale

 

^  尖角符 表示从头开始匹配 写在条件前面

import re
p = re.findall('^alex','alexqweqweq')
print(p)
#输出是['alex'],如果字符串是qqalexqweqweq,那么输出[]。

$ 刀符 表示从末尾开始匹配 写在条件后面

import re
p = re.findall('alex$','alexqweqweqalex')
print(p)
#输出['alex'],如果末尾是'alexqweqweqalexqq',答案是[]。

{ }  花括号符 表示循环之前的条件几次

import re
p = re.findall(r'a{5}','aaaaa')
print(p)
#重复花括号内的东西,结果是输出['aaaaa']。

[ ]  字符集 或者关系,匹配前后条件与字符集其中一个,写在字符集里表示去除所有特殊功能。 

import re
p = re.findall('a[.e]b','a.b')
print(p)
#结果为a.b 因为去除了. 的特殊功能。
import re

p = re.findall('a[bc]d','abc')
print(p)

#结果是abc,符合bc其中的一个。

在字符集中有一些字符还是正常使用的,比如- 多少至多少 ^尖角符,尖角符为非的意思。[0-9]的意思是所有数字,意思等同于\d

import re
p = re.findall('[0-9]','1234')
print(p)
#输出['1','2','3','4']

import re
p = re.findall('[^0-9]','1234qqq')
print(p)

#输出的结果为['q','q','q']
posted @ 2017-08-04 14:38  杨sang  阅读(54)  评论(0)    收藏  举报