Python 查看文件路径是否与特定模式匹配的正则表达式

Python 查看文件路径是否与特定模式匹配的正则表达式,python,regex,Python,Regex,我有一个文件路径列表 l = ['C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\saisie\\saisieCompteBo-flux.xml', 'C:\\src\\main\\webapp\\WEB-INF\\flows\\recherche-flux.xml', 'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\import\\import

我有一个文件路径列表

l = ['C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\saisie\\saisieCompteBo-flux.xml',
     'C:\\src\\main\\webapp\\WEB-INF\\flows\\recherche-flux.xml', 
     'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\import\\import-flux.xml',
     'C:\\src\\main\\webapp\\WEB-INF\\gestionCompteBo-flux.xml', 
     'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompte\\gestionCompte-flux.xml', 
     'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCommunication\\tableauDeBord\\tableauDeBord.xml']
我需要获取与模式匹配的文件路径

pattern = '\\WEB-INF\\flows\\**\\*-flux.xml'
其中,
**
描述了文件夹/目录的递归深度。
*
可能只描述一个文件夹深度。 如何编写正则表达式来获取与此模式匹配的文件路径?如果只有一个
*
,我如何概括

预期产出应为

['C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\saisie\\saisieCompteBo-flux.xml',
 'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\import\\import-flux.xml',

您的模式可以轻松转换为正则表达式:

r'\\WEB-INF\\flows\\.*\\.*-flux\.xml'
  • 保护斜杠的原始前缀
  • 使用
    \\\.\\\\
  • 选择以
    flux.xml
    结尾的任何内容(请注意
    的保护)。不需要过滤掉反斜杠或使用非贪婪,因为计算是从左到右进行的
像这样:

import re

l = ['C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\saisie\\saisieCompteBo-flux.xml',
     'C:\\src\\main\\webapp\\WEB-INF\\flows\\recherche-flux.xml',
     'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\import\\import-flux.xml',
     'C:\\src\\main\\webapp\\WEB-INF\\gestionCompteBo-flux.xml',
     'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompte\\gestionCompte-flux.xml',
     'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCommunication\\tableauDeBord\\tableauDeBord.xml']

result = [x for x in l if re.search(r'\\WEB-INF\\flows\\.*\\.*-flux.xml',x)]
结果:

>>> result
['C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\saisie\\saisieCompteBo-flux.xml',
 'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\import\\import-flux.xml',
 'C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompte\\gestionCompte-flux.xml']

glob.glob
pattern='\WEB-INF\flows\***-flux.xml'
一起使用,这将work@Jean-弗朗索瓦·法布:
glob
在实际目录上工作,而不是在字符串上。请展示您已经尝试过的内容。是的。XY问题太快:)我得到
['C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\saisie\\saisieCompteBo flux.xml','C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompteBo\\import\\import flux.xml','C:\\src\\main\\webapp\\WEB-INF\\flows\\gestionCompte\\gestionCompte flux.xml']
与过滤器匹配*与普通的
*
相比,它不是
*
,而是
*
。不,贪婪与此无关,因为当模式在路径中不使用
***
时,您仍然希望只匹配非路径组件。@MartijnPieters我认为OP在路径中没有
*
。这只是一个通配符=>regex转换的问题。我之所以提到贪婪,是因为如果你使用
r'\\WEB-INF\\flows\\.\.\.\.*.-flux\.xml'
,那么它也会起作用。。。但是在文件名的开头有一个额外的要求,比如
r'\\WEB-INF\\flows\\\\.\\\\\\\\\\\\gestion.*-flux\.xml'
,它不会这样做。是的,准确地说,
*-flux.xml
在一般情况下被正确地翻译成
[^\\\\]*-flux\.xml
,例如在匹配
\\WEB-INF\\flows\\\\\\*.xml
时,或
\\**\\flows\\*-flux\.xml
。请注意后者如何也使用
**
,但不应与任何更深层次的
手势*
目录匹配!