2016-03-29 12 views
0

Ich möchte übereinstimmen, wenn eine Zeichenfolge in einer anderen enthalten ist, unabhängig von der Reihenfolge der Zeichen. Zum Beispiel, wenn ich eine Zeichenfolge habe U-Boot Ich möchte Marines als eine Übereinstimmung zu erkennen.Effizientes ungeordnetes Subsystem-Matching

So wie ich dies derzeit bin Handhabung durch Listen:

def match(x, y): 
    x, y = list(x), list(y) 
    for i in x: 
     try: 
      y.remove(i) 
     except ValueError: 
      return False 
    return True 

Aber das ist ineffizient, wenn ich versuche, viele Kombinationen zu entsprechen.

Ich dachte dann, Regex zu verwenden, aber es nicht geschafft.

Irgendwelche Ideen?

+0

Ah rechts Siehe 'r '\ b [U-Boot] + \ b''. Danke – vedar

+0

Sicher meinst du * "unabhängig von der Reihenfolge der Zeichen" *? Z.B. Wollen Sie auch, dass "U-Boote" Dinge wie "eibsun", "inusb", "seurainb" zusammenbringen? – jDo

+0

Yep, das ist richtig – vedar

Antwort

1

Sie können eine Zeichenklasse[SEARCH_WORD] verwenden, in der jedes Zeichen unabhängig gesucht wird. Durch die Einstellung des + quantifier, nachdem es, Sie suchen nach 1 oder mehr Zeichen, und durch Zugabe von \b Wortgrenzen, werden Sie nur ganze Worte passen:

r'\b[submarine]+\b' 

the regex demo See und die IDEONE demo:

import re 
s = "I have a string submarine I want to be able to detect marines as a match" 
kw = "submarine" 
r = re.compile(r"\b[{0}]+\b".format(kw)) 
print(r.findall(s)) 

HINWEIS: Wenn Ihre Eingabe Nicht-Wortzeichen enthalten kann, insbesondere Zeichen wie ^, ], \ oder -, können Sie diese mitausschließenund verwenden Sie r"(?<!\w)[{0}]+(?!\w)".format(re.escape("submarine")).

import re 
s = "I have a string ^submarine I want to be able to detect ^marines as a match" 
kw = "^submarine" 
r = re.compile(r"(?<!\w)[{0}]+(?!\w)".format(re.escape(kw))) 
print(r.findall(s)) 

IDEONE demo

+0

nur um zu erwähnen, dass das ist etwas langsamer, dass meine Liste Ansatz – vedar

+0

Welche? Wie auch immer, der Listenansatz prüft nicht auf ein ganzes Wort. –

+0

Ich mache Wörterbuch-Lookup-Vergleich. Aber das ist die Antwort, die ich wollte, also nochmals vielen Dank. – vedar