python正则表达式
python正则表达式re模块
打文本中搜索某个字段
python有个库 re
import re
正则表达式 . 点表示任意的字符
[a-z] 这个位置一定是个小写a到z的字母
print(lent(result))
打文本中搜索某个字段
python有个库 re
import re
正则表达式 . 点表示任意的字符
[a-z] 这个位置一定是个小写a到z的字母
print(lent(result))
#!/usr/bin/python import re text='' file = open('shi.txt') for line in file: text=text+line file.close() result = re.findall('a[z-z][a-z]',text) print(result)
result = re.findall(' (a.[a-z]) ',text) # 加上() 表示要括号里面的那些 其他的都不要
这样左右两边的空格都去掉了
去掉重复的结果方法:
result = re.findall(' (a.[a-z]) ',text)
result = set(result)
print(result)
上面的都是a开头的
大写的呢:[Aa] 表示第一个字母可以是大写的A也可以是小写的字母a
*可以匹配一个 多个或者没有
a* :
空
a
aa
aaaaaaaaaaaaaaaa
空格*
可以匹配很多个空格 ‘ *’可以有空格 可以有无数个空格
result = re.findall(' *([Aa].[a-z]) ',text)
竟然匹配除了 safe 的afe 原因:
afe前面没有空格 后面有空格
解决: 分两段过滤
result = re.findall(' *([Aa].[a-z]) |([A].[a-z]) ',text)
结果分两段 一对一对的
看代码:
两个括号 第一个括号没有匹配到的话 就用个空来表示 同理右边
*可以匹配一个 多个或者没有 a* : 空 a aa aaaaaaaaaaaaaaaa 空格* 可以匹配很多个空格 ‘ *’可以有空格 可以有无数个空格 result = re.findall(' *([Aa].[a-z]) ',text) 竟然匹配除了 safe 的afe 原因: afe前面没有空格 后面有空格 解决: 分两段过滤 result = re.findall(' *([Aa].[a-z]) |([A].[a-z]) ',text) 结果分两段 一对一对的 看代码: 两个括号 第一个括号没有匹配到的话 就用个空来表示 同理右边
#!/usr/bin/python import re text='' file = open('shi.txt') for line in file: text=text+line file.close() result = re.findall(' *([Aa].[a-z]) |([A].[a-z]) ',text) final_result = set() #set()是个集合 for pair in result: if pair[0] not in final_result: final_result.add(pair[0]) #左边规则对应出来的叫pair[0] if pair[1] not in final_result: final_result.add(pair[1]) #右边规则对应出来的叫pair[1] final_result.remove('') print(final_result)
稍微总结一下:
.点 表示此位置有一个字符 任意的一个字符
\d 必须是一个数字
\d+ 至少有一个数字
(区别 a* 可以匹配到空)
用一下:
#!/usr/bin/python import re text='' file=open('shi.txt') for line in file: text = text+line file.close() result = re.findall('\d+',text) print (result)
\d{2} 刚好匹配到两个
\d{2,3}可以匹配到两到三个
\w 匹配一个字母 ‘A-Za-z’
\w{2,3}匹配两个或者三个字母
以为某个字符开头的
f=open('imooc.txt') for line in f: if line.startswith('imooc'): print line 以某个字符开头和结尾的语句 #!/usr/bin/python import re def find_start_imooc(fname): f=open(fname) for line in f: if line.startswith('mooc'): print line #find_start_imooc('imooc.txt') def find_in_mooc(fname): f=open(fname) for line in f: if line.startswith('imooc')\ and line.endswith('imooc\n '): #每一行结束都有/n print line find_in_mooc('imooc.txt') #!/usr/bin/python import re def find_start_imooc(fname): f=open(fname) for line in f: if line.startswith('mooc'): print line #find_start_imooc('imooc.txt') def find_in_mooc(fname): f=open(fname) for line in f: if line.startswith('imooc') and line[:-1].endswith('imooc'): #切片操作 print line find_in_mooc('imooc.txt')
匹配一下划线和字母开头的变量名
s3='1 dsf se'
s3.split() 返回切分好的
res = r't[io]p'
方括号里加^ 表示不包含 res = r't[^io]p'
^尖角号 用于行首 r"^hello" 只匹配 行首是 hello的
$ 尾部 r"hello$" 只匹配行尾的
"t[abc$]" 以a或b或c结尾 肯定不是这样的
就像在[^abc]中 ^表示除了abc
\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]
010_12345656
r=r"^010-\d{8}" 重复八次前面的规则 A{8} A重复8次
*
r=r"ab*" 0次至多次(一次也不出现)
+ 匹配一次或者多次 至少一次 与* 有区别
? 表示可有可无
贪婪匹配 跟 非贪婪匹配
r=r"ab+? " 这样以最少的匹配出来了 不会出现abbbbbbbb
{ } 关于花括号 {m,n}至少重复m次 至多重复n次
r=r"a{1,3}"
match() 返回一个对象 如果匹配上了的话
csvt_re = re.compile(r'csvt', re.I)
csvt_re.match('csvt hello')
searcht() 不管在哪里 都能匹配 没有就不匹配了
finditer 返回迭代器对象
re=r'c..t'
re.sub(rs,'python','csvt scat ')
re.split(r'[\+\-\*]',s)