for循环中列表元素的正则表达式

时间:2016-08-26 08:13:32

标签: python

我有一个脚本搜索配置文件,并查找来自另一个列表的所有字符串匹配,如下所示:

dstn_dir = "C:/xxxxxx/foobar"
dst_list =[]
files = [fn for fn in os.listdir(dstn_dir)if fn.endswith('txt')]
dst_list = []
for file in files:
    parse = CiscoConfParse(dstn_dir+'/'+file)
    for sfarm in search_str:
        int_objs = parse.find_all_children(sfarm)
        if len(int_objs) > 0:
            dst_list.append(["\n","#" *40,file + " " + sfarm,"#" *40])
            dst_list.append(int_objs)

我需要更改代码的这一部分:

 for sfarm in search_str:
            int_objs = parse.find_all_children(sfarm)

search_str是一个包含与['xrout:55','old:23']类似的字符串的列表。

所以它只会找到以我在sfarm中迭代的列表中的字符串结尾的条目。我的理解是,这需要我使用re并匹配类似sfarm$的内容,但我不确定如何将此作为循环的一部分。

我说sfarm是可迭代的吗?如果是这样,我需要知道如何在这个上下文中对可迭代对象进行正则表达式。

2 个答案:

答案 0 :(得分:2)

python中的字符串是可迭代的,因此sfarm是可迭代的,但在这种情况下没有什么意义。通过阅读CiscoConfParse.find_all_children()的内容,您的sfarm显然是linespec,这是一个正则表达式字符串。您无需在此明确使用re模块;只需将sfarm'$'联合起来:

search_string = ['xrout:55','old:23']
...
for sfarm in search_str:
    int_objs = parse.find_all_children(sfarm + '$')  # one of many ways to concat
...

答案 1 :(得分:1)

请检查此代码。使用glob模块获取文件夹中的所有“* .txt”文件。

请点击此处查看有关glob module的更多信息。

import glob
import re
dst_list = []
search_str = ['xrout:55','old:23']
for file_name in glob.glob(r'C:/Users/dinesh_pundkar\Desktop/*.txt'):
    with open(file_name,'r') as f:
        text = f.read()
        for sfarm in search_str:
            regex = re.compile('%s$'%sfarm)
            int_objs = regex.findall(text)
            if len(int_objs) > 0:
                dst_list.append(["\n","#" *40,file_name + " " + sfarm,"#" *40])
                dst_list.append(int_objs)
print dst_list

输出:

 C:\Users\dinesh_pundkar\Desktop>python a.py
[['\n', '########################################', 'C:/Users/dinesh_pundkar\\De
sktop\\out.txt old:23', '########################################'], ['old:23']]

C:\Users\dinesh_pundkar\Desktop>