- 预编译正则表达式:
- 预编译正则表达式可以避免每次使用时重新编译,提高效率。在Python中,可以使用
re.compile()
函数。
- 示例代码:
import re
# 预编译正则表达式
pattern = re.compile(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (INFO|WARN|ERROR) - (.*)')
log_line = '2023 - 10 - 10 12:00:00 - INFO - This is an info log'
match = pattern.search(log_line)
if match:
print(match.groups())
- 减少捕获组:
- 捕获组会增加处理开销,如果不需要提取某些部分的数据,尽量减少捕获组。例如,如果只关心日志级别和具体消息,可以这样优化。
- 示例代码:
import re
# 减少捕获组
pattern = re.compile(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} - (INFO|WARN|ERROR) - (.*)')
log_line = '2023 - 10 - 10 12:00:00 - INFO - This is an info log'
match = pattern.search(log_line)
if match:
print(match.groups())
- 使用非贪婪模式:
- 当匹配重复字符时,默认是贪婪模式,会尽可能多地匹配。如果不需要贪婪匹配,使用非贪婪模式
?
。比如在匹配具体消息部分,如果消息中可能包含-
字符,使用非贪婪模式可避免匹配过多。
- 示例代码:
import re
pattern = re.compile(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (INFO|WARN|ERROR) - (.*?)')
log_line = '2023 - 10 - 10 12:00:00 - INFO - This is an info log - additional info'
match = pattern.search(log_line)
if match:
print(match.groups())
- 选择合适的量词:
- 尽量使用精确的量词,如果能确定重复次数,使用
{n}
这种形式,而不是*
或+
,这样正则引擎可以更高效地匹配。例如,如果日期时间中的年份一定是4位数字,使用{4}
。
- 示例代码:
import re
pattern = re.compile(r'(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (INFO|WARN|ERROR) - (.*)')
log_line = '2023 - 10 - 10 12:00:00 - INFO - This is an info log'
match = pattern.search(log_line)
if match:
print(match.groups())