python内置模块连接:
https://www.cnblogs.com/amize/p/13306356.html
re \d \w \s 等解释
https://www.runoob.com/python/python-reg-expressions.html
- 快速使用
# 多行匹配
re.DOTALL
# 查找
findall_ = re.compile('<timestamp value=' + '([\s\S]*Z/)>').findall(xml_line)[0] # 返回列表
match_ = re.compile('<timestamp value=' + '([\s\S]*Z/)>').match(xml_line) # 返回第一个,不搜索新行,match_.group()返回
search_ = re.compile('<timestamp value=' + '([\s\S]*Z/)>').search(xml_line) # 返回第一个,搜索整个字符串,group()返回
# search和group(0),group(1)…的方法
a = “123abc456”
print re.search("([0-9])([a-z])([0-9])",a).group(0) #123abc456,返回整体
print re.search("([0-9])([a-z])([0-9])",a).group(1) #123
print re.search("([0-9])([a-z])([0-9])",a).group(2) #abc
print re.search("([0-9])([a-z])([0-9])",a).group(3) #456
#m.group(N) 返回第N组括号匹配的字符。而m.group() == m.group(0) == 所有匹配的字符,与括号无关,这个是API规定的。
# 替换
# compile()和sub()结合的用法
s = "hello 1234, goodbye, 235"
pat = r'\d+'
m = re.compile(pat).sub('666',s) # hello 666, goodbye, 666
# 贪婪和非贪婪
s="This is a number 234-235-22-423"
r=re.match(".+(\d+-\d+-\d+-\d+)",s) # r.group(1) ,'4-235-22-423'
r=re.match(".+?(\d+-\d+-\d+-\d+)",s) # r.group(1) ,'234-235-22-423'
# 正则表达式模式中使用到通配字,那它在从左到右的顺序求值时,会尽量“抓取”满足匹配最长字符串,
# 在我们上面的例子里面,“.+”会从字符 串的启始处抓取满足模式的最长字符,其中包括我们想得到的第一个整型字段的中的大部分,“\d+”只需一位字符就可以匹配,所以它匹配了数字“4”,而“.+”则匹配了从字符串起始到这个第一位数字4之前的所有字符。
# 解决方式:非贪婪操作符“?”,这个操作符可以用在"*","+","?"的后面,要求正则匹配的越少越好。
re.match(r"aa(\d+)","aa2343ddd").group(1) # '2343'
re.match(r"aa(\d+?)","aa2343ddd").group(1) # '2'
re.match(r"aa(\d+)ddd","aa2343ddd").group(1) # '2343'
re.match(r"aa(\d+?)ddd","aa2343ddd").group(1) #'2343'
1.使用re.compile
# 使用
result = ...
reg_exp = re.compile(date + '[\s\S]*')
matches_list = reg_exp.findall(result)
# 说明
re.compile(pattern[, flags])
参数:
pattern : 一个字符串形式的正则表达式
flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和 # 后面的注释
2.search 分组 group
# python中的search的group(0),group(1)…的方法
a = “123abc456”
print re.search("([0-9])([a-z])([0-9])",a).group(0) #123abc456,返回整体
print re.search("([0-9])([a-z])([0-9])",a).group(1) #123
print re.search("([0-9])([a-z])([0-9])",a).group(2) #abc
print re.search("([0-9])([a-z])([0-9])",a).group(3) #456
#m.group(N) 返回第N组括号匹配的字符。而m.group() == m.group(0) == 所有匹配的字符,与括号无关,这个是API规定的。
3.match的 group
ln ='''<status status="PASS"></status>'''
starttag = re.match("^<(\w+?) .*$", ln).group(1) # status
starttag = re.match("^<(\w+?) .*$", ln).group() # <status status="PASS"></status>
4.findall 取消分组
# 取消分组 ,match好像不生效
img = 9.1800.1239.zip
reg_exp = re.compile('.(\d+).zip') # [1239]
reg_exp = re.compile('.(?:\d+).zip') # ['.1239.zip']
res = reg_exp.findall(img )
# 返回两组匹配结果,每组有自己的分组
reg_exp = re.compile(r'version:\s(0x\w+)\nusage:\s+\d\s-\sit\'s\s(\w+)')
matches_list = reg_exp.findall(rru_version_str) # [('0xDEC76A31', 'active'), ('0xEF7EEBD7', 'passive')]
version_dic ={version:statu for version,statu in matches_list}
5.sub()使用
# 1. compile()和sub()结合的用法
s = "hello 1234, goodbye, 235"
pat = r'\d+'
m = re.compile(pat).sub('666',s) # hello 666, goodbye, 666
# 2. 直接使用
re.sub('[^a-zA-Z0-9]', ' ', str) #替换str中的特殊字符为空格
6.split()使用
line = 'aaa bbb ccc;ddd eee,fff'
# 单字符切割
re.split(r';',line) # ['aaa bbb ccc', 'ddd\teee,fff']
# 两个字符以上切割需要放在 [ ] 中
re.split(r'[;,]',line) # ['aaa bbb ccc', 'ddd\teee', 'fff']
#所有空白字符切割
re.split(r'[;,\s]',line) # ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff']
# 使用括号捕获分组,默认保留分割符
re.split(r'([;])',line) # ['aaa bbb ccc', ';', 'ddd\teee,fff']
# 不想保留分隔符,以(?:...)的形式指定
re.split(r'(?:[;])',line) # ['aaa bbb ccc', 'ddd\teee,fff']
7. escape(pattern)
可以对字符串中所有可能被解释为正则运算符的字符进行转义的应用函数。
如果字符串很长且包含很多特殊技字符,而你又不想输入一大堆反斜杠,或者字符串来自于用户(比如通过raw_input函数获取输入的内容),且要用作正则表达式的一部分的时候,可以使用这个函数。
举例说明:
re.escape('www.python.org') # 'www\\.python\\.org'
re.findall(re.escape('w.py'),"jw.pyji w.py.f") # ['w.py', 'w.py']
这里的re.escape(‘w.py’)作为了函数re.findall函数的正则表达式部分。