在Python循环中重复使用正则表达式的最有效方法是什么?

时间:2010-07-16 14:57:17

标签: python regex

当你在文件中迭代数百行时,在Python中运行正则表达式的最有效和最有效的方法是什么?

具体来说,是以下不良形式?

for line in file:
  data = re.search('(\d+\.\d+)\|(-\d+\.\d+)\|(.*?)\|(.*?)\|(\d+:\d+\s+\w+)\sTO\s(.*?)',line)
  one = data.group(1)
  two = data.group(2)
  three = data.group(3)
  four = data.group(4)
  five = data.group(5)
  six = data.group(6)
  # do the magic...

3 个答案:

答案 0 :(得分:6)

如果你只是一遍又一遍地使用这个相同的正则表达式,你不需要直接编译它。 http://docs.python.org/release/2.6.5/library/re.html#re.compile

  

传递给re.match(),re.search()或re.compile()的最新模式的编译版本被缓存,因此一次只使用几个正则表达式的程序不必担心编译正则表达式。

但是,我非常建议不要像以前那样执行下面的任务。尝试这样的事情:

for line in file:
    data = re.search('(\d+\.\d+)\|(-\d+\.\d+)\|(.*?)\|(.*?)\|(\d+:\d+\s+\w+)\sTO\s(.*?)',line)
    groups = data.groups()
    # do the magic...

MatchObject.groups()返回匹配中所有组的元组,未参与匹配的组被分配了传递给groups()的值(所述值默认为None )。

答案 1 :(得分:3)

在循环之前保存正则表达式。

rx = re.compile( '(\d+\.\d+)\|(-\d+\.\d+)\|(.*?)\|(.*?)\|(\d+:\d+\s+\w+)\sTO\s(.*?)' )
for line in file:
  data = re.search(rx,line)
  one = data.group(1)
  two = data.group(2)
  three = data.group(3)
  four = data.group(4)
  five = data.group(5)
  six = data.group(6)

答案 2 :(得分:1)

除非速度是一个问题,否则你可能想要阅读你喜欢阅读的内容,哪些有效。