re模块

#!/usr/bin/env python
# encoding: utf-8
"""
@version: python3.6
@file: re_module.py
@time: 2017/10/29 15:01
"""
'''
字符串提供的方法是完全匹配 正则表达式:模糊匹配
正则表达式(或re) 是用来匹配字符串的
元字符:
. 通配符 可以匹配除换行符(/n)外的任何一个字符,一个“.”表示一个字符 若指定flag DOTALL,则匹配任意字符,包括换行
^ 尖角符 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
$ 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
* 重复匹配 范围为[0,+OO] 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
+ 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
? 匹配前一个字符1次或0次 ret = re.findall('a?b','aaaabghabfb');print(ret)
{}匹配前一个字符m次 ret = re.findall('a{5}b','aaaaabghabfb');print(ret)
{n,m} 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']

结论: *等价于[0,+oo] +等价于{1,+oo} ?等价于{0,1} {1,}等价于{1,+oo}
[] 字符集 具有取消元字符的功能(“\ ^ -”除外)
\ 反斜杠后边跟元字符去除特殊功能 反斜杠后边跟普通字符实现特殊功能
| 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() #'ABC'
() 分组匹配 re.search("abc|ABC","ABCDabcCD").group() #abcabca456c


'''
# s = 'hello world'
# print(s.find('ll'))
# print(s.replace('ll','xx'))
# print(s.split('w'))

import re
# ret = re.findall('w\w{2}l','hello world')
# print(ret)

# ret = re.findall('w..l','hello w\t ld') # .
# print(ret)
# ret = re.findall('^h...o','hjasojkkjdkjn') # ^
# print(ret)
# ret = re.findall('h...o$','hjasojkkjhkjo') # $
# print(ret)
# ret = re.findall('alex.*li','halexojkklijhkjoale') # $
# print(ret)

# []
# ret = re.findall('a[c,d]x','acx')
# print(ret)#['acx']
# ret = re.findall('[a-z]','acx')
# print(ret)#['a', 'c', 'x']
# ret = re.findall('[w,*,.]','wacx*.,')
# print(ret)#['w', '*', '.', ','] #[] 字符集 具有取消元字符的功能
# ret = re.findall('[1-9,a-z,A-Z]','12TYas')#ret = re.findall('[1-9a-zA-Z]','12TYas')
# #当'12TYas'中没有逗号(,)时,两式表达形式相同
# print(ret)#['1', '2', 'T', 'Y', 'a', 's'] #[] 字符集 具有取消元字符的功能
#^放在[]中表示取反
# ret = re.findall('[^t]','iu12tyAiuS')
# print(ret)#['i', 'u', '1', '2', 'y', 'A', 'i', 'u', 'S']
# ret = re.findall('[^4,,5]','iu12ty,A4i5uS')
# print(ret)#['i', 'u', '1', '2', 't', 'y', 'A', 'i', 'u', 'S']#[^4,5]表示[4,5]取反

'''
\
反斜杠后边跟元字符去除特殊功能
反斜杠后边跟普通字符实现特殊功能

\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 匹配一个特殊字符边界,也就是指单词和空格间(特殊字符,逗号也算特殊字符)的位置
\A 只从字符串开头匹配,re.search("\Aabc","alexabc")是匹配不到的
\Z 匹配字符串结尾,同$
'(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
结果{'province': '3714', 'city': '81', 'birthday': '1993'}
'''
# print(re.findall('\d{11}','sdf23412789424729392034782'))#['23412789424', '72939203478'] 匹配11个数字
# print(re.findall('\sasd','fak sadf asd'))#[' asd'] 匹配空白字符
#
# print(re.findall(r'I\b','hello,I am a LIST'))


# #匹配出第一个满足条件的结果
# ret = re.search('sb','sdfsfsfadsadsbsdfasb')
# print(ret)#<_sre.SRE_Match object; span=(12, 14), match='sb'>
# print(ret.group())#sb

ret=re.search('a\.\+','a.ga.+j').group()
print(ret)# a.
ret=re.search('a.','a.gj').group()
print(ret)# a.

'''
反斜杠的困扰
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。
假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":
前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。
同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
# ret = re.findall('\\\\','sdfa\esdf')
## #ret = re.findall(r'\\','sdfa\fsdf')#等同上
# print(ret)
'''

#()
print(re.search('(as)+','sdjkfasas').group())#asas



'''正则表达式的方法:
1.findall():所有结果都返回到一个列表中
2.search(): 返回匹配到的第一个对象,对象可以调用group() 返回结果
3.match(): 从字符串的开头开始匹配,也返回匹配到的第一个对象,对象可以调用group() 返回结果
4.split():
eg:ret = re.split('[k,s]','sdsksal');print(ret)#['', 'd', '', '', 'al'],先按K分 再按s分
5. sub(): ret = re.sub('a..x','s..b','hfjasalexxdhf') ;print(ret) #hfjass..bxdhf #匹配字符并替换
6. compile(): re.findall('\.com','fhasjd.comhfajld')#
与这个相同 obj=re.compile('\.com');ret = obj.findall('fhasjd.comhfajld');print(ret)
只有多次调用时,这才具有优势
'''

ret = re.findall('www.\w+.com','www.baidu.com')#['www.baidu.com']
ret = re.findall('www.(\w+).com','www.baidu.com')#['baidu']#表示只取出匹配()中那一部分
ret = re.findall('www.(?:\w+).com','www.baidu.com')#['www.baidu.com']#?:表示取消()的优先级
print(ret)

ret = re.finditer('\d','ds3sy4784a')
print(ret)#<callable_iterator object at 0x0000017651C44860>
print(next(ret).group())#3
posted @ 2017-10-31 07:45  探寻猎人  阅读(211)  评论(0)    收藏  举报