我希望得到所有“xlsx”文件,其中包含“反馈报告”。我想让这个过滤器非常强大。所以任何部分匹配,如'feedback_report','反馈报告','反馈报告'都应该返回true。
示例文件名:
下面是徒劳的尝试。
regex = re.compile(r"[a-zA-Z0-0]*[fF][eE][eE][dD][bB][aA][cC][kK]\s[rR][eE][pP][oO][rR][tT][a-zA-Z0-0]*.xlsx")
这将有效:
re.search("(feedback)(.*?|\s)(report)",string,re.IGNORECASE)
使用代码在以下输入列表上进行测试
import re
a=["ZSS Project_JKIAL-SA_FEEDBACK_REPORT_Jan 29th 2015.xlsx",
"ZL-SA_feedback report_012844.xlsx",
"ASARanem-SA_Feedback Report_012844.xlsx",
"some report",
"feedback-report"]
for i in a:
print(re.search("(feedback)(.*?|\s)(report)",i,re.IGNORECASE))
OP所预期的输出是:
<_sre.SRE_Match object; span=(21, 36), match='FEEDBACK_REPORT'>
<_sre.SRE_Match object; span=(6, 21), match='feedback report'>
<_sre.SRE_Match object; span=(12, 27), match='Feedback Report'>
None
<_sre.SRE_Match object; span=(0, 15), match='feedback-report'>
您的正则表达式几乎可以接受,但开始和结束部分将无法正确匹配,因为您的示例中有下划线。我不确定这些是您的实际数据的代表性,但要匹配您在此所需的内容:
regex = re.compile(r"[a-zA-Z0-0\_\-\s]*(feedback)[\s\_\-](report)[a-zA-Z0-0\_\-\s]*.xlsx",
flags = re.IGNORECASE)
您应该注意的另一件事是确保您实际上只使用文件名而不是文件路径,因为在这种情况下您将不得不担心\
和/
字符。另请注意,我只是匹配我注意到你缺少的确切字符。你可能想试试
regex = re.compile(r"*(feedback)*(report)*.xlsx", flags = re.IGNORECASE)
但是,我不确定你的数据实际上是什么样的。希望这可以帮助
首先,小写文件名以尽量减少可能的选项数量
regex = re.compile('feedback.{0,3}report.*\.xlsx?', flags=re.IGNORECASE)
寻找“反馈”,接下来最多3个字符,接下来的“报告”,以及其他任何内容,以点和xls或xlsx扩展名结尾
要不就
filename = 'ZL-SA_feedback report_012844.xlsx'
matched = re.search('feedback.{0,3}report.*\.xlsx?', filename.lower())
您还可以使用python glob模块以linux方式搜索文件:
import glob
glob.glob('*[fF][eE][dD][bB][aA][cC][kK]*[rR][eE][pP][oO][rR][tT]*.xlsx')
你可以使用像下面这样的字符串方法吗?
'feedbackreport' in name.replace('_', '').replace(' ', '').lower()
并且
name.endswith('.xlsx')
给你这样的东西:
fileList = [
'ZSS Project_JKIAL-SA_FEEDBACK_REPORT_Jan 29th 2015.xlsx',
'ZL-SA_feedback report_012844.xlsx',
'ASARanem-SA_Feedback Report_012844.xlsx'
]
fileNames = [name for name in fileList
if ('feedbackreport' in name.replace('_', '').replace(' ', '').lower()
and name.endswith('.xlsx'))]
如果有更多的字符可能导致问题,如-
,那么你也可以快速删除坏字符:
def remove_bad_chars(string, chars):
for char in chars:
string = string.replace(char, '')
return string
将if语句的适当部分修改为:
if 'feedbackreport' in remove_bad_chars(name, '.,?!\'-/:;()"\\~ ').lower()
# included a white space in the string of bad characters
我根据您的所有建议将其用于我的字符串。在99%的情况下,这适用于我。
regex = re.compile(r"[a-zA-Z0-9\_\-\s]*(feedback)(\s|\_)(report)s?[a-zA-Z0-9\_\-\s]*.xlsx",flags = re.IGNORECASE)