要想学习基础的,可以看看别人写的很全的一篇:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
图列出了Python支持的正则表达式元字符和语法,是别人整理出来,要多看几次,用几次,记住了就会好了:
因为不喜欢教科书的方式,这里不会有很全的知识说明,也不什么基础的,我就拿自己学习到的东西分享下:
直接上例子:
01-19 18:13:47.203 I/ActivityManager( 410): Displayed com.xxxx.xx/com.y: +5s159ms (total +8s324ms)
筛选上面 字体串的5s159ms并计算成5159ms
import re
time_list = []
text_file = "01-19 18:13:47.203 I/ActivityManager( 410): Displayed com.xxxx.xx/com.y: +5s159ms (total +8s324ms)"
data = re.findall(r'\+([\d]+)s?([\d]+)ms+\s',str(text_file))
print data
for res in data:
match_data = res[0]*(1 if res[1]>0 else 0) + res[1]
time_list.append(match_data)
print time_list
'\+([\d]+)s?([\d]+)ms+\s'
这个就是这个正则匹配的字符串,这里解释下吧:
这里用findall得到的是一个列表,但加了(),就会在列表中多了元组,eg:[(x,x),(y,y)]
\+就是正常的加号,([\d]+)s?是匹配5s的5的表达式,([\d]+)ms+\s是匹配519ms中519数字的加一个空格的方式,如果没有这个空格,就会匹配到后面的那个8s324ms
存入元组后再用res[0]*(1 if res[1]>0 else 0) + res[1]的方式,把s的数值和ms的数值结合起来,就成了我们要的数值。
其实这个运行的时候有个问题:就是如果时间是+159ms的时候,生成的列表中的元组是[('15', '9')],是1s159ms生成的列表元组是[('1', '159')],前面的情况我自己也有点想不明白,但是也可以解决问题,有时间的时候慢慢看下这个原因吧。,上面用time_list这个数组的原因是但有多行字符串的时候,用列表存入筛选的时间,这个例子就完成了。
下面这个例子不全,但是对我有用的:
在多行字符串中选出:
nm=77_1&jdhs=1421661372948&d2er=2100501039&value=206
三个方法:
第二个方法先出来 的是整行,第一个和第三个方法选出来的是value的值
data123 = []
re1='(nm)' # Word 1
re2='(=)' # Any Single Character 1
re3='(77)' # Integer Number 1
re4='(_)' # Any Single Character 2
re5='(1)' # Integer Number 2
re6='.*?' # Non-greedy match on filler
re7='(value)' # Word 2
re8='(=)' # Any Single Character 3
re9='(\\d+)' # Integer Number 3
print re1+re2+re3+re4+re5+re6+re7+re8+re9
rg = re.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9,re.IGNORECASE|re.DOTALL)
upload_data = rg.findall(str(text_file))
for cycle_num in range(len(upload_data)):
data123.append(upload_data[cycle_num][7])
print data123
<pre name="code" class="python">
#方法二
rg = re.compile(r'nm=77_1.*?value=\d+',re.IGNORECASE|re.DOTALL)data1 = rg.findall(str(text_file))<pre name="code" class="python">print data1
#方法三
data = re.findall(r'nm=77_1.*?value=?(\d+)',str(text_file))
print data