2016-08-01 345 views
-1

我有一些配置文件,我只需要从中提取一些值。例如,我有这样的:正则表达式只匹配某一行的一部分

​​

我需要提取一定的特性参数的值,例如description的价值。如何在Python3中使用正则表达式来完成此操作?

回答

1

这里是正则表达式,假设该文件的文本是在txt

import re 

m = re.search(r'^\s*description\s*=\s*(.*?)(?=(//)|$)', txt, re.M) 
print(m.group(1)) 

让我解释一下。 ^匹配在行首。 然后\s*表示零个或多个空格(或制表符) description是您找到值部分的锚点。 之后,我们预计=之前或之后的可选空格标记为\s*=\s*。 然后我们通过表示(.*?)来捕获=和可选空格之后的所有内容。该表达式由括号捕获。在括号内,我们说以任何方式(点)匹配任何次数(星号)以非贪婪的方式(问号),即一旦匹配下面的表达式即停止。

以下表达式是一个超前表达式,从(?=开始,它与(?=之后的东西匹配。 而那东西实际上是两个选项,用竖线|分隔。

第一个选项,在酒吧的左边说//(在括号中用垂直酒吧选择操作的原子单位),也就是说,评论的开始,我认为你没有想要捕捉。 第二个选项是$,意思是该行的结尾,如果没有注释//就行了。 所以我们在第一个=符号之后寻找我们可以做的所有事情,直到我们遇到//模式,或者我们遇到线路末端。这是(?=(//)|$)部分的精髓。

我们还需要re.M标志,告诉我们要^$分别匹配行的开始和结束,正则表达式引擎。如果没有标志,它们会匹配整个字符串的开始和结尾,这在这种情况下并不是我们想要的。

-1

这是一个非常简单的正则表达式,你只需要一个积极的lookbehind,并可以选择删除注释。 (通过附加?(//)?的正则表达式做到这一点)

r"(?<=description =).*" 

Regex101 demo

+0

评论由我添加只是为了claryfying:P – Kerbiter

+0

这也将匹配文档行。 – Kasramvd

+0

什么是“doc line”? – RamenChef

0

的更好的方法是使用建立配置文件系统。 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。)

为什么要避免正则表达式?它们很贵,对于这种情况并不理想。使用简单的字符串匹配这样可以避免导入模块并简化代码。但我真的会说转换为支持的配置文件格式。