生成路径的正则表达式

时间:2015-05-06 21:04:21

标签: python regex path

我正在尝试编写一个从路径列表中删除不需要的路径的函数,那些不需要的路径具有相同的模式,例如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

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

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

我希望这很清楚,在节点Accept and Integrate之后删除每个路径后跟更多的子节点。

3 个答案:

答案 0 :(得分:0)

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

(^.*?\/(?: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

答案 1 :(得分:0)

不是匹配你不想要的东西,你可以匹配你想要的东西: ^.*/(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

答案 2 :(得分:0)

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

^\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']