Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python正则表达式文件名匹配_Python_Regex_Exception_Sendmail - Fatal编程技术网

Python正则表达式文件名匹配

Python正则表达式文件名匹配,python,regex,exception,sendmail,Python,Regex,Exception,Sendmail,您好,我需要我的正则表达式代码来查找特定格式的匹配文件名,如ankit_bill_2019-12-02-00_abc01.csv或ankit_bill_2019-12-02-00_abc.csv等。文件的最后一个字符应该只有这些特定值,例如abc、abc01、abc02、cde、cde01。除此之外,应使用不匹配的文件名发送电子邮件。此处对匹配和不匹配调用电子邮件功能。我只希望对不匹配值调用电子邮件功能 ##Packages used import os import re import sys

您好,我需要我的正则表达式代码来查找特定格式的匹配文件名,如ankit_bill_2019-12-02-00_abc01.csv或ankit_bill_2019-12-02-00_abc.csv等。文件的最后一个字符应该只有这些特定值,例如abc、abc01、abc02、cde、cde01。除此之外,应使用不匹配的文件名发送电子邮件。此处对匹配和不匹配调用电子邮件功能。我只希望对不匹配值调用电子邮件功能

##Packages used
import os
import re
import sys
import glob
import pandas as pd

def sendMail(msg):
    a=''
    for i in msg:
        a+="%s\n" %i

   # a = "File Name Not Valid:\n ".join(str(i) for i in msg)

    sendmail_location = "/usr/sbin/sendmail" # sendmail location
    p = os.popen("%s -t" % sendmail_location, "w")
    p.write("From: %s\n" % "abc@zy.com")
    p.write("To: %s\n" % "abc@zy.com")
    p.write("Subject:File Name Not Valid\n")
    p.write("\n") # blank line separating headers from body
    p.write("File Name Is Not Valid:\n"+a)
    status = p.close()
    if status != 0:
        print "Sendmail exit status", status
        #return msg


##file match
match=[]
not_match=[]
try:
    for file in glob.glob('*.csv'):
        r = re.search(r'ankit_bill_(20[0-9][0-9])-([1-9]|1[0-2]|0[0-9])-([1-9]|1[0-9]|2[0-9]|3[0-1]|0[0-9])-[0-9]{2}_[a-z0-6]]{3,5}.csv', file)
        if r:
            match.append(file)
        if not r:
            not_match.append(file)
    sendMail(not_match)
except Exception:
    not_found="File Not Found"
    sendMail(not_found)
#print(match)
#print(not_match)

您可以使正则表达式更加具体,将模式的结尾从
[a-z0-6]{3,5}.csv
更改为
(?:abc|cde)[0-6]{0,2}\.csv\b

请注意,模式中的
]
太多,必须对
进行转义才能与之匹配

\bankit_bill_20[0-9][0-9]-(?:[1-9]|1[0-2]|0[0-9])-(?:[1-9]|1[0-9]|2[0-9]|3[0-1]|0[0-9])-[0-9]{2}_(?:abc|cde)[0-6]{0,2}\.csv\b
如果应该有3个小写字符而不是abc和def,请使用
[a-z]{3}[0-6]{0,2}\.csv\b


添加此项,就好像文件名匹配为非匹配一样\u匹配将变为空列表,如果是这种情况,则添加此条件以终止函数
如果len(a):sys.exit(0)

非常感谢您的帮助。您能帮助我解决其他问题吗?另一个问题是sendmail函数的问题。我希望该函数只为不匹配调用,但它为匹配调用too@ankit我无法重现,请看这个例子@我在jupyter笔记本上试用过的foruth bird,它工作正常,直到or条件
(?:abc | cde)
,但是当我添加
(?:abc | cde)[0-6]{0,2}
时,它会给我一个空列表,对于哪些字符串,你会得到一个期望匹配的空列表?我知道了,我刚刚更改了最后一个数字字符的大小,即
{0,2}
这就是我得到空列表的原因,我还解决了电子邮件部分,谢谢你的帮助