如何使用正则表达式 python 部分搜索单词

How to partial search for words using regex python

我想获取某处包含 'feedback report' 的所有 'xlsx' 个文件。我想让这个过滤器非常强大。所以像 'feedback_report'、'feedback report'、'Feedback Report' 这样的任何部分匹配都应该 return 为真。

示例文件名:

  1. ZSS Project_JKIAL-SA_FEEDBACK_REPORT_Jan 第 29 2015.xlsx
  2. ZL-SA_feedback report_012844.xlsx
  3. ASARanem-SA_Feedback Report_012844.xlsx

下面是徒劳的尝试。

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")

你能像下面这样只使用字符串方法吗?

'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

首先,小写文件名以尽量减少可能的选项

regex = re.compile('feedback.{0,3}report.*\.xlsx?', flags=re.IGNORECASE)

查找 'feedback',接下来最多 3 个任意字符,接下来 'report',然后再次查找,以点和 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')

您的正则表达式几乎可以接受,但开始和结束部分将无法正确匹配,因为您的示例中有下划线。我不确定这些对您的实际数据有多具有代表性,但要匹配您在此处拥有的数据,您需要:

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)

但是,我再次不确定您的数据实际上是什么样的。希望这有帮助

这会起作用:

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'>

我根据您的所有建议将其用于我的字符串。这在 99% 的情况下对我有用。

regex = re.compile(r"[a-zA-Z0-9\_\-\s]*(feedback)(\s|\_)(report)s?[a-zA-Z0-9\_\-\s]*.xlsx",flags = re.IGNORECASE)