在Python中使用正则表达式匹配列表项

0 投票
1 回答
521 浏览
提问于 2025-04-17 21:49

我正在尝试写一个Python脚本,用来显示我安装的nginx上的URL流向。目前,我的脚本正在打开一个叫做'rewrites'的文件,这个文件里有一些正则表达式和位置的列表,内容大概是这样的:

rewritei ^/ungrad/info.cfm$ /ungrad/info/ permanent;

现在,我的Python脚本正在读取这个文件,并把每行的第一个和最后一个词(rewritei和premanent;)去掉,这样就只剩下一个列表,像这样:

[
    ['^/ungrad/info.cfm$', '/ungrad/info'],
    ['^/admiss/testing.cfm$', '/admiss/testing'],
    ['^/ungrad/testing/$', '/ungrad/info.cfm']
]

这样处理后,列表的第一个元素就是被监控的URL,第二个元素就是重定向到的URL。接下来,我想做的是,拿每个第一个元素,使用正则表达式去检查整个列表,看看它是否和任何一个第二个元素匹配。

举个例子,列表中的[0][0]会和[2][1]匹配。

不过,我现在在想一个好的、高效的方法来实现这个功能时遇到了一些困难。

1 个回答

1
import re

a = [
    ['^/ungrad/info.cfm$', '/ungrad/info'],
    ['^/admiss/testing.cfm$', '/admiss/testing'],
    ['^/ungrad/testing/$', '/ungrad/info.cfm']
]



def matchingfun(b):
    for list1 in a: # iterating the main list
        for reglist in list1: # iterating the inner lists
            count  = 0
            matchedurl = []
            for innerlist in reglist[:1]: # iterating the inner list items
                c = b.match(innerlist) # matching the regx
                if c:
                    count = count+1
                    if count > 0:
                        matchedurl.append(reglist)
    return matchedurl

result1 = []
for list1 in a:
    for reglist in list1:
        b = re.compile(reglist[0])
        result = matchingfun(b)
        result1.extend(result)

bs = list(set(result1))

print "matched url is", bs

我觉得这样做有点不够高效,不过我已经做到了一定程度了。希望这能回答你的问题。上面的代码片段会打印出与整个列表中第二个项目匹配的所有网址。

撰写回答