2016-06-19 21 views
1

Grundsätzlich habe ich eine Liste der Teilstrings, nach denen ich eine Zeichenfolge suche. Ich benutze any() derzeit und etwas Arbeit, wenn eines der Wörter in der Zeichenfolge gefunden wird. Ich möchte die Spiele protokollieren, um Statistiken über die Spiele zu erhalten. Ich benutze any() gerade jetzt.Python: Finden eines Teilstrings innerhalb eines Strings aus einer Liste, aber Speichern des Teilstrings

Gibt es eine Möglichkeit, das Gleiche zu tun, aber das Match in einer Variablen zu speichern? Ich hole und suche alle 10 Sekunden bis zu 100 Zeichenfolgen für eine Liste von 25-30 Teilzeichenfolgen. Das einzige, was ich mir vorstellen kann, ist das Durchlaufen jedes Teilstrings in der Liste für jeden String, aber ich bin mir nicht sicher, welche Auswirkungen dies auf die Performance hat.

Antwort

0

Für diese Art von Sache könnten Sie das re Modul verwenden.

>>> import re 
>>> m = re.search(r"substring1, substring2, substring3", string) 

string wäre die Zeichenfolge, die Sie durch bist, und m würde die Variable sein, die die Gruppe von Strings enthält passende was Strings Sie für das heißt substring1, substring2, substring3 suchen; Sie könnten auch RegEx-Muster anstelle von Teilstrings verwenden.

+0

Würde dies alle übereinstimmenden Teilstrings in 'm' oder nur die erste speichern? – Michael

1

Es gibt mehrere Möglichkeiten, dies zu tun. Reguläre Ausdrücke (wie FreddieV4 vorgeschlagen hat) sind sehr mächtig.

jedoch ein weiterer einfacher Ansatz wird mit einer Liste Verständnis wie:

matches = [x for x in string.split() if x in substrings] 

, die in der Zeichenfolge der Schleife über die Worte und prüfen, ob das Wort eines des Teils paßt, wenn so wird es zurückgegeben und kann daher für Protokollierungszwecke verwendet werden.

Sie können dies sogar noch erweitern, um eine Liste von Strings als Eingabe anstelle einer einzelnen Zeichenfolge zu behandeln - alles in einem einzigen Listenverständnis.

Ein umfangreiches Beispiel ist unten dargestellt:

substrings = ["cool","test","notpresent"] 

#get matches for a single string 
string = "This is a basic test" 
matches = [x for x in string.split() if x in substrings] 
print(matches) 
# >> ['test'] 


#get matches for multiple strings 
strings = ["I am so awesome", "you are cool", "I think so", "Yep this is a test"] 
matches = [x for string in strings for x in string.split() if x in substrings] 
print(matches) 
# >> ['cool', 'test'] 
+0

Sie müssen die Zeichenfolge aufteilen. –

+0

Warum ist das @ JaredGoguen? – DJanssens

+1

'x für x in string' iteriert über die einzelnen Zeichen in' string'. –

1

Lassen Sie uns an diesem Beispiel aussehen:

s = "Thisisarandomstringthatiwanttotype" 
subst = ["This", "random", "hullo", "type"] 

alle Teil zurückzukehren, die passen:

filter(lambda x: x in s, subs) 
>> ['This', 'random', 'type'] 

den Start zurückzukehren Index der Teilstrings, die übereinstimmen, können Sie die Liste der Strings übergeben, die vom Code-Segment zurückgegeben werden ment oben auf eine Map-Funktion ihren Index zu finden:

map(lambda x: s.index(x), filter(lambda x: x in s, subs)) 
>> [0, 7, 30] 

In ähnlicher Weise können Sie die Länge der zurückgegebenen Strings überprüfen könnten Karte über den Filter mit:

map(lambda x: len(x), filter(lambda x: x in s, subs)) 
>> [4, 6, 4] 

Oder finden Sie die Länge des längsten Teilzeichen zurückgegeben:

max(filter(lambda x: x in s, subst), key=len) 
>> 'random'