我需要从不同的文本文件中提取(很多)信息。 我想知道是否有比以下更短更有效的方法:
第一部分:( 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行用于输入字典很少或根本没有逻辑。
答案 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检查之后,你没有明确的方法来确定结果是什么以及使用哪个变量。此时,仅在单个变量中收集它或在条件体内移动特定逻辑可能更有意义。但是很难说出你提供的信息量。