给初学者的 Python 建议。正则表达式,字典等?

Posted

技术标签:

【中文标题】给初学者的 Python 建议。正则表达式,字典等?【英文标题】:Python Advice for a beginner. Regex, Dictionaries etc? 【发布时间】:2010-11-01 08:48:20 【问题描述】:

我正在编写我的第二个 python 脚本来尝试解析配置文件的内容,并希望得到一些新手建议。我不确定是否最好使用正则表达式来解析我的脚本,因为它有多行?我也一直在阅读有关字典的内容,并想知道这是否是一种好习惯。我不一定要寻找代码,只是朝着正确的方向前进。

示例:我的配置文件如下所示。

Job 
  Name = "host.domain.com-foo"
  Client = host.domain.com-fd
  JobDefs = "DefaultJob"
  FileSet = "local"
  Write Bootstrap = "/etc/foo/host.domain.com-foo.bsr"
  Pool = storage-disk1
  

我应该使用正则表达式、行拆分还是模块?如果我的配置文件中有多个作业,我会使用字典将作业与池相关联吗?

【问题讨论】:

【参考方案1】:

如果你可以改变配置文件格式,你可以直接把你的文件写成Python文件。

config.py

job = 
  'Name' : "host.domain.com-foo",
  'Client' : "host.domain.com-fd",
  'JobDefs' : "DefaultJob",
  'FileSet' : "local",
  'Write Bootstrap' : "/etc/foo/host.domain.com-foo.bsr",
  'Pool' : 'storage-disk1'

yourscript.py

from config import job

print job['Name']

【讨论】:

这对于安全来说通常是非常危险的,因为简单地读取配置文件可能会运行任意操作。 +1:非常好。这不存在安全问题,除非某个疯狂的人决定编写疯狂的参数值。 如果你不能改变格式但你信任他的文件,你可以阅读,替换:for = 和 eval() 但是您不能总是信任该文件。许多程序使用相对名称(“config/.py”)读取文件,因此在 /tmp 等任何人都可以放置此类文件的目录中执行时很容易受到攻击。 @bortzmeyer:由于只导入作业,因此风险很小。如果您关心有人恶意更改值以指向错误的资源,那么任何其他配置文件都可能发生这种情况。如果您担心加载 dict 时会执行代码,那么嗯……您有什么可能性?将 dict 子类化并覆盖 getitem 以执行某些代码的“工作”?相当棘手。 OP 没有提到安全性。【参考方案2】:

这个任务有许多现有的替代方案,json、pickle 和 yaml 到名称 3。除非你真的想自己实现这个,你应该使用其中之一。即使您自己滚动,遵循上述格式之一仍然是一个好主意。

此外,使用解析器/生成器或类似工具进行解析是一个更好的主意,正则表达式对于此类任务将更难维护且效率更低。

【讨论】:

【参考方案3】:

如果你的配置文件可以转成python文件,只要把它做成字典并导入模块。

Job =  "Name" : "host.domain.com-foo",
        "Client" : "host.domain.com-fd",
        "JobDefs" : "DefaultJob",
        "FileSet" : "local",
        "Write BootStrap" : "/etc/foo/host.domain.com-foo.bsr",
        "Pool" : "storage-disk1" 

您只需调用 Job["Name"]..etc 即可访问这些选项。

ConfigParser 也很容易使用。您可以创建一个如下所示的文本文件:

[Job]
Name=host.domain.com-foo
Client=host.domain.com-fd
JobDefs=DefaultJob
FileSet=local
Write BootStrap=/etc/foo/host.domain.com-foo.bsr
Pool=storage-disk1

只要像上面的一样保持简单。

【讨论】:

+1:保持简单。重用现有的解决方案。尽可能少地发明。生活的话。【参考方案4】:

标准库中的ConfigParser 模块可能是解析 Python 脚本正在使用的配置文件的最 Pythonic 和最直接的方式。

如果您仅限于使用您概述的特定格式,那么使用 pyparsing 非常好。

【讨论】:

【参考方案5】:

我认为正则表达式不足以解析这样的内容。您可以查看一个真正的解析器,例如pyparsing。或者,如果文件格式在您的控制范围内,您可以考虑使用 XML。有用于解析的标准 Python 库。

【讨论】:

以上是关于给初学者的 Python 建议。正则表达式,字典等?的主要内容,如果未能解决你的问题,请参考以下文章

从 python 中成功的正则表达式匹配构建字典

python初学者日记02(正则表达式)

Python 用正则表达式解析数据变成字典。

Python 正则表达式详解(建议收藏!)

如何确保我的 Python 正则表达式输出字典?

Python Pandas 和正则表达式使用字典替换 Dataframe 中的项目