Python regex لمطابقة ملف في قائمة الملفات (الحصول على خطأ)

StackOverflow https://stackoverflow.com/questions/2344193

  •  23-09-2019
  •  | 
  •  

سؤال

أحاول استخدام regex في Python لمطابقة ملف (تم حفظه كسلسلة ، أي "/volumes/footage/foo/bar.mov") إلى ملف سجل أقوم بإنشاء قائمة بالملفات. ولكن عندما أقوم بتشغيل البرنامج النصي ، فإنه يعطيني هذا الخطأ: sre_constants.error: unbalanced parenthesis. الرمز الذي أستخدمه هو:

لقراءة الملف:

theLogFile = The_Root_Path + ".processedlog"
if os.path.isfile(theLogFile):
        the_file = open(theLogFile, "r")
    else:
        open(theLogFile, 'w').close()
        the_file = open(theLogFile, "r")
    the_log = the_file.read()
    the_file.close()

ثم داخل أ for حلقة أعيد تعيينها (لم أكن أدرك أنني كنت أفعل هذا حتى نشرت هذا السؤال) the_file متغير كسلسلة من قائمة الملفات (التي تم الحصول عليها عن طريق تشغيل مجلد ومجموعات فرعية والاستيلاء على جميع أسماء الملفات) ، ثم حاول استخدام Regex لمعرفة ما إذا كان اسم الملف موجودًا في ملف السجل:

for the_file in filenamelist:
    p = re.compile(the_file, re.IGNORECASE)
    m = p.search(the_log)

في كل مرة يضرب re.compile() جزء من الكود يبصق هذا الخطأ. وإذا حاولت قطع ذلك واستخدامه re.search(the_file, the_log) لا يزال يبصق هذا الخطأ. لا أفهم كيف يمكنني الحصول على قوسين غير متوازن من هذا.

هل كانت مفيدة؟

المحلول

جوردون ،

يبدو لي أن القضية موجودة في البيانات. أنت تقوم بتجميع سلاسل غير متوقعة من filelist في regexp ، وليس الاهتمام بأنها قد تحتوي على شخصيات ميتا ذات صلة بمحرك RegexP.

في حلقة الخاص بك ، أضف أ print the_file قبل مكالمة إعادة .pile (لا توجد مشكلة في إعادة استخدام اسم كإيرادات حلقة أشار إلى كائن الملف من قبل) ، حتى تتمكن من معرفة الأوتار التي تأتي بالفعل من The Filelist. أو الأفضل من ذلك ، قم بتشغيل جميع حالات the_file re.escape قبل تمريرهم لإعادة. سيؤدي هذا إلى تحويل جميع أحرف التعريف إلى ما يعادلها العادي.

نصائح أخرى

أين هو نمط التعبير العادي؟ هل تحاول استخدام أسماء الملفات الموجودة في ملف واحد كنماذج للبحث في الملف الآخر؟ إذا كان الأمر كذلك ، فأنت تريد أن تتخطى the_file مع بعض مثل

for the_pattern in the_file:
    p = re.compile(the_pattern, re.IGNORECASE)
    m = p.search(the_log)
    ...

وفق بيثون re.compile توثيق, ، الحجة الأولى ل re.compile() يجب أن يكون نمط التعبير العادي كسلسلة.

لكن قيمة الإرجاع open() هو كائن ملف ، يتم تعيينه إلى the_file ويمر إلى re.compile()....

ما ترتبط بالاسم the_file في المقتطف الأول هو أ كائن الملف, ، على الرغم من أنك تقول إن هذا "تم حفظه كسلسلة" ، إلا أنه تم تسمية اسم الملف (أي السلسلة) theLogFile لكن ما تحاول أن تتحول إلى كائن Re هو ليس theLogFile (السلسلة) ، إنها the_file (كائن الملف المغلق الآن). بالنظر إلى هذا ، فإن الخطأ غريب إلى حد ما (يتوقع المرء أ TypeError) ، لكن من الواضح أنك إرادة احصل على خطأ في re.compile.

الملف يجب أن تكون سلسلة. في الكود أعلاه ، فإن قيمة إرجاع Open ، وهي كائن ملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top