SequenceMatcher: Keine Übereinstimmung nur einmal aufnehmen?

  • Ich verwende SequenceMatcher, um einen Satz von Wörtern innerhalb einer Textgruppe zu finden. Das Problem, das ich habe, ist, dass ich aufzeichnen muss, wenn es keine Übereinstimmung findet , sondern einmal pro Text . Wenn ich eine if-Anweisung versuche, erhalten Sie jedes Mal ein Ergebnis, wenn der Vergleich mit einem anderen Wort fehlschlägt.

     names=[JOHN, LARRY, PETER, MARY]
    files = [path or link]
    
      for file in files: 
         for name in names:
            if SequenceMatcher(None, name, file).ratio() > .9:
                 do something
            else:
                 print name + 'not found'
     

    Ich habe auch re.match und re.find ausprobiert und dasselbe Problem tritt auf. Der obige Code ist eine einfache Version meiner Arbeit. Ich bin auch neu in Python. Vielen Dank!

    22 November 2011
    Connie
2 answers
  • Wenn ich Ihren Kommentar richtig interpretiere (aber ich bin mir nicht 100% sicher!), kann dies den allgemeinen Mechanismus veranschaulichen, dem Sie folgen können:

     [pre> >>> text = 'If JOHN would be married to PETER, then MARY would probably be unhappy'
    >>> names = ['JOHN', 'LARRY', 'PETER', 'MARY']
    >>> [text.find(name) for name in names]
    [3, -1, 28, 40]  #This list will be always long as the names list
     

    Was "Mechanismen, denen Sie folgen können" bedeutet, dass SequenceMatcher (die ich mit der eingebauten Methode find ersetzte) nicht nur als Test funktionieren sollte True | False], sollte aber bereits die Informationen ausgeben, die Sie speichern möchten.

    HTH!

    22 November 2011
    macfrank
  • Der einfachste Weg wäre, die übereinstimmenden Namen zu verfolgen und sie nicht zu drucken, wenn sie bereits gedruckt wurden:

     seen = {}
    for file in files:
        for name in names:
            if SequenceMatcher(None, name, file).ratio() > .9:
                do something
            elif name not in seen:
                seen[name] = 0
                print name + 'not found'
     
    22 November 2011
    Dave