coding=utf8
import re
s = "<html><body><h1>hello world<h1></body></html>"
start=s.find('<h1>')
print(start)
st="aabcaaaaaaaa"
s=r"abc"
print(re.findall(s,st))
元字符
st="tip top tap tep temp"
s=r"t[io]p" #[]用来指定字符集i和o 匹配以t开头,p结尾,中间i和o
print(re.findall(s,st))
s=r"t[^io]p" #过滤规则然后取反 在[]的前面加^
print(re.findall(s,st))
[]中出现元字符将不起作用
r=r"t[abc")) #['t$'] 把元字符当成了普通字符处理
print(re.findall(r,"t^")) #['t^'] 在[]元素的后面加^表示当成普通字符串处理
[]还可以用一个大的范围
r=r"x[0-9]x"
print(re.findall(r,'x1x'))
r=r"x[a-zA-Z0-9]x"
print(re.findall(r,"xAx x0x xzx"))
^ 作用一般用于行首
st="hello world,hello girl"
r=r"hello"
print(re.findall(r,st))
匹配开头是hello的结果
r =r"^hello"
print(re.findall(r,st))
以$符号来匹配是否以...结尾
r=r"girl$"
print(re.findall(r,st))
\转义元字符
st="^abc"
r=r"^abc"
print(re.findall(r,st))
r=r"[0-9]"
print(re.findall(r,'3333'))
r=r"\d" # 匹配任何十进制,相当于[0-9]
print(re.findall(r,'978675675785'))
r=r"\D" #匹配任何非数字字符,相当于类[^0-9]
print(re.findall(r,'908Ab更改'))
r=r"\s" #匹配任何空白字符,相当于类[\t\n\r\f\v]
print(re.findall(r,"908jh "))
r=r"\S" #匹配任何非空白字符,相当于类[\t\n\r\f\v]
print(re.findall(r,"908jh "))
r=r"\w" #匹配任何字母数字字符,相当于类[a-zA-Z0-9_]
print(re.findall(r,"908jhAB更改"))
r=r"\W" #匹配任何非字母数字字符,相当于类[^a-zA-Z0-9_]
print(re.findall(r,"908jhAB更改"))
重复 正则表达式是能够匹配不定长的字符集
另一个功能是可以指定正则表达式的一部分的重复次数
mobile ="010-12345678"
r = r"^010-\d{8}" #{}来表示\d重复的次数
print(re.findall(r,mobile))
r=r"ab" # * 用来指定前一个字符可以被匹配零次或多次,而不是只有一次
print(re.findall(r,'ababbb'))
r=r"a[abc]d"
print(re.findall(r,'abcdb'))
r=r"ab+" # + 表示匹配一次或多次 * 和+的不同:* 匹配零次或多次,而+则至少出现一次
print(re.findall(r,'ac')) #[]
print(re.findall(r,'abb')) #['abb']
mobile ="010-12345678"
r = r"^010-*\d{8}"
print(re.findall(r,'010123456789'))
print(re.findall(r,'010--123456789'))
r=r"^010-?\d{8}" # ?表示指定前一个字符可以匹配一次或零次,可以用来处于标识某字符是可选
print(re.findall(r,'01012345678'))
r=r"ab+" #贪婪模式,最大限度的匹配所有的数据
print(re.findall(r,'abbbbbbbbbbbb')) #['abbbbbbbbbbbb']
r=r"ab+?" #非贪婪模式 最多匹配一次的数据
print(re.findall(r,'abbbbb')) #['ab']
{m,n} m和n都是十进制整数,意思是至少有m个重复,最多到n个重复
m不指定会认为下边界是0,忽略n则是将上边界设置为无限大(至多20亿)
{0}等同于,{1,}等同于+ ,而{0,1}则与?相同,建议最好使用、+、?
r=r"a{1,3}" #表示a这个字符最少重复1次,最多3次
print(re.findall(r,"sdjhfk"))
正则的编译方法 re.compile(str) 编译后的正则要比未编译的正则匹配起来的速度快很多
r1=r'\d{3,4}-?\d{8}'
p_tel=re.compile(r1)
print(p_tel.findall("010-12345678"))
编译时可接受一些特殊的标志参数,常用来实现不同的特殊功能和语法变更
csvt_re=re.compile(r"csvt",re.I)
print(csvt_re.findall("Csvtcsvt"))
反斜杠的麻烦 字符串前加“r”反斜杠就不会被任何特殊方式处理
\section 要匹配的字符串 \section 为re.compile取消反斜杠的特殊意义
"\\section" 为"\section"的字符串实值(string literals)取消反斜杠的特殊意义
执行匹配
match() 匹配要找的字符串是否在首位置,只有在首位置才会返回一个对象
csvt_re=re.compile(r"csvt",re.I)
print(csvt_re.match('csvt hello')) #如果存在这个字符串则返回的是一个match对象
print(csvt_re.match("hello")) #如果不存在这个字符串则返回空
print(csvt_re.match("hello csvt")) #如果存在的这个字符串不在首位置则返回空
search() 扫描字符串,找到对应字符串匹配的位置返回一个对象
csvt_re=re.compile(r"csvt",re.I)
print(csvt_re.search('hello csvt')) #search是只要在字符串中,不论在什么位置,只要存在就返回一个对象
print(csvt_re.search("hello")) #如果不存在这个字符串则返回空
findall() 匹配所有的字符串,并把他们作为一个列表返回
finditer() 匹配所有的字符串,并把他们作为一个迭代器返回(需要用迭代的方式才能从中依次把数据取出来)
print(csvt_re.findall("Csvtcsvt hello"))
print(csvt_re.findall("Csvt hello CSvt csVt csvt hello"))
print(csvt_re.finditer("Csvt hello CSvt csVt csvt hello")) #是个迭代对象
网友评论