为路径生成正则表达式

2024-05-14 11:28:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个函数,从路径列表中删除不需要的路径,这些不需要的路径具有相同的模式,例如c:/project1/main/Node/Accept/*something 这是我的密码

def filtre(list):
    for i,item in enumerate(list):
        matchObject=re.search(r"(Accept/.*[/])", item) or re.search(r"(Integrate/.*[/])", item)
        if matchObject :
            list.remove(item)   
        else:
            i=i+1
    return list

这是我的全局列表的一个例子:(Input)

c:/project1/main/Node/Accept/testCase1/Browse.c
c:/project1/main/Node/Accept/testCase2/navigate.c
c:/project1/main/Node/Accept/testCase2/save.c
c:/project1/main/Node/Accept/testCase4/search.c
c:/project1/main/Node/Accept
c:/project1/main/Node/Integrate
c:/project1/main/Node/Accept/destroy/fullCoverage/remove.py
c:/project1/main/Tree/Integrate/testCase1/Browse.c
c:/project1/main/Tree/Integrate

期望输出:

c:/project1/main/Node/Accept
c:/project1/main/Node/Integrate
c:/project1/main/Tree/Integrate

我希望是清楚的,删除每一条路径后都会有更多的子节点接受并集成节点。你知道吗


Tags: 路径renodetree列表searchmainitem
3条回答

您可以使用以下正则表达式来匹配所需的输出:

(^.*?\/(?:Accept|Integrate))$

如果要删除不必要的路径。。您可以使用以下选项:

(^.*?\/(?:Accept|Integrate))(?!$).*

Python代码:

def filtre(list):
    for i,item in enumerate(list):
        matchObject=re.search(r"(^.*?\/(?:Accept|Integrate))(?!$).*", item)
        if matchObject :
            list.remove(item)   
        else:
            i=i+1
    return list

DEMO

您可以使用以下正则表达式:

^\S+?(?:Accept|Integrate)\s*$

Demo

在Python中:

txt='''\
c:/project1/main/Node/Accept/testCase1/Browse.c
c:/project1/main/Node/Accept/testCase2/navigate.c
c:/project1/main/Node/Accept/testCase2/save.c
c:/project1/main/Node/Accept/testCase4/search.c
c:/project1/main/Node/Accept
c:/project1/main/Node/Integrate
c:/project1/main/Node/Accept/destroy/fullCoverage/remove.py
c:/project1/main/Tree/Integrate/testCase1/Browse.c
c:/project1/main/Tree/Integrate'''

>>> re.findall(r'^\S+?(?:Accept|Integrate)\s*$', txt, re.M)
['c:/project1/main/Node/Accept', 'c:/project1/main/Node/Integrate', 'c:/project1/main/Tree/Integrate']

如果源代码是字符串列表而不是单个字符串,请将filter与相同的正则表达式一起使用:

>>> filter(lambda s: re.search(r'^\S+?(?:Accept|Integrate)\s*$', s), txt.splitlines())
['c:/project1/main/Node/Accept', 'c:/project1/main/Node/Integrate', 'c:/project1/main/Tree/Integrate']

你可以通过以下方式来匹配你想要的,而不是匹配你不想要的: ^.*/(Accept|Integrate)$

现在,循环还有另一个问题:不能从正在迭代的列表中删除项!你需要做一个临时的结果列表。你知道吗

由于您似乎想“就地”筛选列表,因此可以使用以下方法: list[:] = tmp

代码如下:

import re

def filtre(list):
    tmp = []
    for item in list:
        # matchObject=re.search(r"Accept/.*/]", item) or re.search(r"(Integrate/.*/])", item)
        if re.match(r"^.*/(Accept|Integrate)$", item):
            tmp.append(item)
    list[:] = tmp


input = ["c:/project1/main/Node/Accept/testCase1/Browse.c",
"c:/project1/main/Node/Accept/testCase2/navigate.c",
"c:/project1/main/Node/Accept/testCase2/save.c",
"c:/project1/main/Node/Accept/testCase4/search.c",
"c:/project1/main/Node/Accept",
"c:/project1/main/Node/Integrate",
"c:/project1/main/Node/Accept/destroy/fullCoverage/remove.py",
"c:/project1/main/Tree/Integrate/testCase1/Browse.c",
"c:/project1/main/Tree/Integrate"
]

filtre(input)
print '\n'.join(input)

结果:

c:/project1/main/Node/Accept
c:/project1/main/Node/Integrate
c:/project1/main/Tree/Integrate

相关问题 更多 >

    热门问题