我有一些配置文件,我只需要从中提取一些值。例如,我有这样的:正则表达式只匹配某一行的一部分
我需要提取一定的特性参数的值,例如description
的价值。如何在Python3中使用正则表达式来完成此操作?
我有一些配置文件,我只需要从中提取一些值。例如,我有这样的:正则表达式只匹配某一行的一部分
我需要提取一定的特性参数的值,例如description
的价值。如何在Python3中使用正则表达式来完成此操作?
这里是正则表达式,假设该文件的文本是在txt
:
import re
m = re.search(r'^\s*description\s*=\s*(.*?)(?=(//)|$)', txt, re.M)
print(m.group(1))
让我解释一下。 ^
匹配在行首。 然后\s*
表示零个或多个空格(或制表符) description
是您找到值部分的锚点。 之后,我们预计=
之前或之后的可选空格标记为\s*=\s*
。 然后我们通过表示(.*?)
来捕获=
和可选空格之后的所有内容。该表达式由括号捕获。在括号内,我们说以任何方式(点)匹配任何次数(星号)以非贪婪的方式(问号),即一旦匹配下面的表达式即停止。
以下表达式是一个超前表达式,从(?=
开始,它与(?=
之后的东西匹配。 而那东西实际上是两个选项,用竖线|
分隔。
第一个选项,在酒吧的左边说//
(在括号中用垂直酒吧选择操作的原子单位),也就是说,评论的开始,我认为你没有想要捕捉。 第二个选项是$
,意思是该行的结尾,如果没有注释//
就行了。 所以我们在第一个=
符号之后寻找我们可以做的所有事情,直到我们遇到//
模式,或者我们遇到线路末端。这是(?=(//)|$)
部分的精髓。
我们还需要re.M
标志,告诉我们要^
和$
分别匹配行的开始和结束,正则表达式引擎。如果没有标志,它们会匹配整个字符串的开始和结尾,这在这种情况下并不是我们想要的。
这是一个非常简单的正则表达式,你只需要一个积极的lookbehind,并可以选择删除注释。 (通过附加?(//)?
的正则表达式做到这一点)
r"(?<=description =).*"
的更好的方法是使用建立配置文件系统。 Python在configparser
模块中内置了对类INI文件的支持。
但是,如果你只是拼命需要的description
后能得到在该文件中的文本字符串,你可以这样做:get_value_for_key("description", "myfile.txt")
:
def get_value_for_key(key, file):
with open(file) as f:
lines = f.readlines()
for line in lines:
line = line.lstrip()
if line.startswith(key + " ="):
return line.split("=", 1)[1].lstrip()
你可以像呼叫时使用。如果没有找到,该方法将返回None
。假定您的文件将被格式化为有空格且密钥名称后面的等号(例如, key = value
。
这完全避免了正则表达式,并保留了值右侧的空白。 (如果这对你不重要,你可以使用strip
而不是lstrip
。)
为什么要避免正则表达式?它们很贵,对于这种情况并不理想。使用简单的字符串匹配这样可以避免导入模块并简化代码。但我真的会说转换为支持的配置文件格式。
评论由我添加只是为了claryfying:P – Kerbiter
这也将匹配文档行。 – Kasramvd
什么是“doc line”? – RamenChef