Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python循环中重复使用正则表达式最有效的方法是什么?_Python_Regex - Fatal编程技术网

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

在Python循环中重复使用正则表达式最有效的方法是什么?,python,regex,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

当您在一个文件中迭代数百行时,在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...

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

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)

如果您只是反复使用同一个正则表达式,则不需要直接编译它

传递给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
)。

除非速度是个问题,否则您可能只想阅读自己喜欢的内容,我建议使用
data=rx.search(line)
而不是
data=re.search(rx,line)
。不需要保存正则表达式。重新缓存已编译的正则表达式,因此每次迭代只保存一次字典查找。@Ned:heh..这对我来说是新闻!:-)Python真的很棒@奈德:不过我相信它只能缓存一定数量的内容。你可以在re.py中读取代码:它可以缓存100个条目。奇怪的是,当缓存达到100个条目时,它只是清除整个缓存并重新开始…或者,如果确实需要变量:
one、two、three、four、five、six=data.groups()
这对我的一般Python学习非常有帮助。谢谢你!但值得一提的是,我现在已经对所有报告的实现进行了实验,并且在性能上几乎没有差异。