Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.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_Linux_Awk_Sed - Fatal编程技术网

Python 需要基于配置文件中的键获取值的帮助吗

Python 需要基于配置文件中的键获取值的帮助吗,python,regex,linux,awk,sed,Python,Regex,Linux,Awk,Sed,我有一个包含类似数据的文件 [xxx] name = xxx address = bangalore [yyy] name = yyy address = sjc 请帮助我获取一个正则表达式,我可以根据xxx或yyy(xxx或yyy和地址或名称是输入)获取地址/名称值。如果您的文件与此类似,您可以使用awk执行类似操作(即名称与节相同,并且在地址之前): 或者,更好的方法是,您可以获取节,然后获取键、值(发生时)并打印它们,然后退出: $ awk -v sec='yyy' -v key=

我有一个包含类似数据的文件

[xxx]

name = xxx
address = bangalore

[yyy]

name = yyy
address = sjc

请帮助我获取一个正则表达式,我可以根据xxx或yyy(xxx或yyy和地址或名称是输入)获取地址/名称值。

如果您的文件与此类似,您可以使用
awk
执行类似操作(即
名称与节相同,并且在
地址之前)

或者,更好的方法是,您可以获取节,然后获取键、值(发生时)并打印它们,然后退出:

$ awk -v sec='yyy' -v key='address' '
                    BEGIN{
                          FS=" *= *"
                          pat=sprintf("^\\[%s\\]", sec)} 
                    $0 ~ pat {secin=$1; next}
                    NF==2 && $1==key && secin ~ pat {print $2; exit}' file
sjc 
如果要收集所有节及其键/值对,可以(使用
gawk
)执行以下操作:


Config或.ini文件可以像csv一样使用引号,因此最好使用完整的配置文件解析器。您可以使用或具有健壮的库来解析.ini或配置类型文件

Python示例:

#!/usr/bin/python

import ConfigParser
config = ConfigParser.ConfigParser()
config.read("/tmp/file")
然后,您可以抓取部分、每个部分中的项目或特定部分中的特定项目:

>>> config.sections()
['xxx', 'yyy']
>>> config.items("yyy")
[('name', 'yyy'), ('address', 'sjc')]
>>> config.get("xxx", "address")
'bangalore'

如果您的文件就是这样(即,
名称
与节相同,并且位于
地址
之前),则可以使用
awk
执行类似操作:

或者,更好的方法是,您可以获取节,然后获取键、值(发生时)并打印它们,然后退出:

$ awk -v sec='yyy' -v key='address' '
                    BEGIN{
                          FS=" *= *"
                          pat=sprintf("^\\[%s\\]", sec)} 
                    $0 ~ pat {secin=$1; next}
                    NF==2 && $1==key && secin ~ pat {print $2; exit}' file
sjc 
如果要收集所有节及其键/值对,可以(使用
gawk
)执行以下操作:


Config或.ini文件可以像csv一样使用引号,因此最好使用完整的配置文件解析器。您可以使用或具有健壮的库来解析.ini或配置类型文件

Python示例:

#!/usr/bin/python

import ConfigParser
config = ConfigParser.ConfigParser()
config.read("/tmp/file")
然后,您可以抓取部分、每个部分中的项目或特定部分中的特定项目:

>>> config.sections()
['xxx', 'yyy']
>>> config.items("yyy")
[('name', 'yyy'), ('address', 'sjc')]
>>> config.get("xxx", "address")
'bangalore'
雷格克斯来营救
这种方法将条目拆分为单个元素,然后解析键值对。最后,您只需向结果字典查询ie.
值['xxx']

重新导入
string=”“”
[xxx]
name=xxx
地址=班加罗尔
[yyy]
name=yyy
地址=sjc
"""
rx_项=重新编译(r''
^\[(?P[^][]*)\]
.*?
(?=^\[[^][]*\]$\Z)
'',re.X | re.M | re.DOTALL)
rx_value=re.compile(r'^(?P\w+)\s*=\s*(?P.+)$),re.MULTILINE)
值={item.group('name'):{
m、 组('key'):m.group('value'))
对于rx_value.finditer(item.group(0))中的m
对于rx_item.finditer中的项(字符串)
}
打印(值)
#{'xxx':{'name':'xxx','address':'bangalore'},'yyy':{'name':'yyy','address':'sjc'}
Regex救命
这种方法将条目拆分为单个元素,然后解析键值对。最后,您只需向结果字典查询ie.
值['xxx']

重新导入
string=”“”
[xxx]
name=xxx
地址=班加罗尔
[yyy]
name=yyy
地址=sjc
"""
rx_项=重新编译(r''
^\[(?P[^][]*)\]
.*?
(?=^\[[^][]*\]$\Z)
'',re.X | re.M | re.DOTALL)
rx_value=re.compile(r'^(?P\w+)\s*=\s*(?P.+)$),re.MULTILINE)
值={item.group('name'):{
m、 组('key'):m.group('value'))
对于rx_value.finditer(item.group(0))中的m
对于rx_item.finditer中的项(字符串)
}
打印(值)
#{'xxx':{'name':'xxx','address':'bangalore'},'yyy':{'name':'yyy','address':'sjc'}

不清楚您是要搜索方括号内的值还是“name”标记的值,但以下是对您的问题的一种可能解释的解决方案:

$ cat tst.awk
BEGIN { FS=" *= *" }
!NF   { next }
NF<2  { prt(); k=$0 }
      { map[$1] = $2 }
END   { prt() }
function prt() { if (k=="["key"]") print map[tag]; delete map }

$ awk -v key='yyy' -v tag='address' -f tst.awk file
sjc

$ awk -v key='xxx' -v tag='address' -f tst.awk file
bangalore

$ awk -v key='xxx' -v tag='name' -f tst.awk file
xxx
$cat tst.awk
开始{FS=“*=*”}
!NF{next}

NF不清楚您是否试图搜索方括号内的值或“name”标记的值,但以下是对您的问题的一种可能解释的解决方案:

$ cat tst.awk
BEGIN { FS=" *= *" }
!NF   { next }
NF<2  { prt(); k=$0 }
      { map[$1] = $2 }
END   { prt() }
function prt() { if (k=="["key"]") print map[tag]; delete map }

$ awk -v key='yyy' -v tag='address' -f tst.awk file
sjc

$ awk -v key='xxx' -v tag='address' -f tst.awk file
bangalore

$ awk -v key='xxx' -v tag='name' -f tst.awk file
xxx
$cat tst.awk
开始{FS=“*=*”}
!NF{next}

NF使用编程语言(如
PHP
Python
)更容易做到这一点,这是可能的吗?谢谢!!请推荐python,我可以在环境中试用并更新您。使用编程语言(例如
PHP
python
)更容易做到这一点,这是可能的吗?谢谢!!请推荐python,我可以在环境中试用并更新您。