在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次,findall 匹配所有。
语法格式为:
findall(string[, pos[, endpos]])
参数:
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 、search()、findall() 等函数使用。
语法格式为:
re.compile(pattern[, flags])
参数:
pattern : 一个字符串形式的正则表达式
flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
'''
使用re.findall正则处理不定长度但有一定格式的字符串:
日志格式: 书名,作者,单价
book1,test1,1001, book2,test2,1002, book3,test4,1004
book1,test5,1005, book6,test6,1006, book7,test7,1007, book1,test8,1008
book9,test9,1009, book10,test10,10010
'''
import re
def analyzer_line(line):
global pattern
ary = pattern.findall(line)
for i in range(len(ary)):
print(ary[i][1], ary[i][2], ary[i][3])
'''
此方法读入日志文件,600万条记录,只要十多分钟
'''
def anlyzer_file(file):
book_file = open(file, "r")
while True:
line = book_file.readline()
if not line:
break
analyzer_line(line)
def anlyzer_file2(file):
with open(file, 'r') as f:
for line in f:
analyzer_line(line)
if __name__ == '__main__':
str = "(| )(\S+),(\S+),(-*\d+)(,|)"
pattern = re.compile(str, re.IGNORECASE)
book_file = "./logs/books.log"
anlyzer_file2(book_file)
参考:
https://www.runoob.com/python/python-reg-expressions.html