سؤال

أتساءل عن أفضل طريقة للتعامل مع هذه المشكلة بالذات ، وإذا كانت هناك أي مكتبات (يفضل أن أكون مرنًا إذا لزم الأمر).

لدي ملف مع سلسلة على كل سطر. أود أن أجد أطول أنماط شائعة ومواقعها في كل سطر. أعلم أنه يمكنني استخدام SequencEmatcher لمقارنة السطر الأول والثاني والآخر والثلاث ، لذا ، ثم ربط النتائج ، ولكن إذا كان هناك شيء يفعله بالفعل؟

من الناحية المثالية ، ستظهر هذه المباريات في أي مكان على كل سطر ، لكن بالنسبة للمبتدئين ، يمكن أن أكون على ما يرام معهم الموجودين في نفس الإزاحة في كل سطر وأذهب من هناك. قد يكون هناك شيء يشبه مكتبة الضغط التي لديها واجهة برمجة تطبيقات جيدة للوصول إلى جدول السلسلة الخاص بها ، لكنني لم أجد أي شيء حتى الآن يناسب هذا الوصف.

على سبيل المثال مع هذه الخطوط:

\x00\x00\x8c\x9e\x28\x28\x62\xf2\x97\x47\x81\x40\x3e\x4b\xa6\x0e\xfe\x8b
\x00\x00\xa8\x23\x2d\x28\x28\x0e\xb3\x47\x81\x40\x3e\x9c\xfa\x0b\x78\xed
\x00\x00\xb5\x30\xed\xe9\xac\x28\x28\x4b\x81\x40\x3e\xe7\xb2\x78\x7d\x3e

أود أن أرى أن 0-1 و 10-12 تطابق في جميع الخطوط في نفس الموضع والخط 1 [4،5] يطابق الخط 2 [5،6] يتطابق مع السطر 3 [7،8].

شكرًا،

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

المحلول

إذا كان كل ما تريده هو العثور على فرعية شائعة في نفس الإزاحة في كل سطر ، فكل ما تحتاجه هو شيء من هذا القبيل:

matches = []
zipped_strings = zip(s1,s2,s3)
startpos = -1
for i in len(zipped_strings):
  c1,c2,c3 = zipped_strings[i]
  # if you're not inside a match, 
  #  look for matching characters and save the match start position
  if startpos==-1 and c1==c2==c3:
    startpos = i
  # if you are inside a match, 
  #  look for non-matching characters, save the match to matches, reset startpos
  elif startpos>-1 and not c1==c2==c3:
    matches.append((startpos,i,s1[startpos:i]))
    # matches will contain (startpos,endpos,matchstring) tuples
    startpos = -1
# if you're still inside a match when you run out of string, save that match too!
if startpos>-1:
  endpos = len(zipped_strings)
  matches.append((startpos,endpos,s1[startpos:endpos]))

للعثور على أطول نمط شائع بغض النظر عن الموقع ، يبدو SequencEmatcher مثل أفضل فكرة ، ولكن بدلاً من مقارنة String1 إلى String2 ثم String1 إلى String3 ومحاولة دمج النتائج ، فقط الحصول على جميع الأساسيات الشائعة من String1 و String2 (مع Get_matching_blocks) ، ثم قارن كل نتيجة لذلك بـ String3 للحصول على المباريات بين الأوتار الثلاثة.

نصائح أخرى

هل أداء مشكلتك؟

ما هو حجم مدخلاتك؟

هل الحد الأدنى لطول السلاسل لمطابقة 2؟

لاحظ أن مثالك غير صحيح وأعتقد أن النتائج التي تتوقعها لا تتطابق مع سلاسل العينة التي قدمتها.

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