使用re.compiler提取数据的最佳方法

时间:2017-02-05 13:06:41

标签: python regex data-extraction

我需要从不同的文本文件中提取(很多)信息。 我想知道是否有比以下更短更有效的方法:

第一部分:( N行长)

N1 = re.compile(r'')
N2 = re.compile(r'')
.
Nn = re.compile(r'')

第二部分:( 2N行长)

with open(filename) as f:
  for line in f:
    if N1.match(line):
      var1 = N1.match(line).group(x).strip()
    elif N2.match(line):
      var2 = N1.match(line).group(x).strip()
    elif Nn.match(line):
      varn = Nn

您是否建议将re.compile vars(第1部分)与第2部分分开。在这种情况下,您的人们使用了什么?也许是一个将正则表达式作为参数的函数?并且每次都打电话。

在我的情况下,N是30,这意味着我有90行用于输入字典很少或根本没有逻辑。

2 个答案:

答案 0 :(得分:0)

正如re module documentation中提到的那样,您通过re方法传递的正则表达式被缓存:根据您拥有的表达式的数量,自己缓存它们可能没用。

话虽如此,你应该列出你的正则表达式,这样一个简单的for循环就可以测试你所有的模式。

regexes = map(re.compile, ['', '', '', '', ...])
vars = ['']*len(regexes)
with open(filename) as f:
  for line in f:
    for i,regex in enumerate(regexes):
      if regex.match(line):
         var[i] = regex.match(line).group(x).strip()
         break  # break here if you only want the first match for any given line.

答案 1 :(得分:0)

我将尝试回答这个问题而不知道你在实际做什么。所以这个答案可能对你有所帮助,也可能没有。

首先,re.compile所做的是预编译正则表达式,因此您可以在以后使用它,而不必在每次使用它时编译它。当您拥有在整个程序中多次使用的正则表达式时,这非常有用。但是如果表达式只使用了几次,那么预先编译它就没那么多好处。

所以你应该问问自己,代码运行的频率是多少,试图匹配所有这些表达式。在脚本执行期间只是一次吗?然后,您可以通过内联表达式使代码更简单。由于您正在为文件中的每一行运行匹配,因此预编译可能在这里有意义。

但仅仅因为你预先编译了表达式,这并不意味着你应该马虎并且经常匹配相同的表达式。看看这段代码:

if N1.match(line):
    var1 = N1.match(line).group(x).strip()

假设匹配,则会运行N1.match()两次。这是你应该避免的开销,因为匹配表达式可能相对昂贵(取决于表达式),即使表达式已经预编译。

相反,只需匹配一次,然后重复使用结果:

n1_match = N1.match(line)
if n1_match:
    var1 = n1_match.group(x).strip()

查看您的代码,您的正则表达式似乎也是独立的 - 或者至少您只使用第一个匹配并跳过其余的匹配。在这种情况下,您应该确保订购支票 这样就可以先完成最常见的检查。这样,您可以避免运行太多无法匹配的表达式。此外,尝试对它们进行排序,以便更少地运行更复杂的表达式。

最后,您将在单独的变量varN中收集匹配结果。在这一点上,我正在质疑你在那里做了什么,因为在你所有的if检查之后,你没有明确的方法来确定结果是什么以及使用哪个变量。此时,仅在单个变量中收集它或在条件体内移动特定逻辑可能更有意义。但是很难说出你提供的信息量。

相关问题