我正在尝试编写一个从路径列表中删除不需要的路径的函数,那些不需要的路径具有相同的模式,例如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之后删除每个路径后跟更多的子节点。
答案 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*$
在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']