2016-04-03 7 views
0

In Python, wie würde ich eine bestimmte Anzahl von Zeichen um einen Teilkette bekommen?Get Satznummer Radius von Zeichen um Teilzeichenfolge

Zum Beispiel, hier ist mein string:

string='Mad Max: Fury Road' 

Lassen Sie uns sagen, dass ich von 'ax: Fur', auf beiden Seiten, in den Ausgang vier Zeichen weg hinzufügen wollte, so wäre es 'ad Max: Fury Ro' sein.

Wenn die zu suchende Teilzeichenfolge 'Fury Road' in string war, dann wäre die Ausgabe , und es würde ignoriert, dass auf der rechten Seite nichts hinzuzufügen ist.

Antwort

2

str.partition kommt wirklich praktisch hier:

def get_sub(string, sub, length): 
    before, search, after = string.partition(sub) 
    if not search: 
     raise ValueError("substring not found") 
    return before[-length:] + sub + after[:length] 

Sie auch eine ValueError nur before in der if Anweisung anstelle der Erhöhung zurückkehren konnte. Das würde die Zeichenfolge unverändert zurückgeben. Verbrauch:

print(get_sub("Mad Max: Fury Road", "Fury Road", 4)) 
#ax: Fury Road 
print(get_sub("Mad Max: Fury Road", "Fu", 4)) 
#ax: Fury R 
+0

Sie auch 'bevor tun können, in der Mitte, nach = ...' statt 'Teile = ...' dann die Elemente des 'parts' bekommen, wäre ein wenig leichter sein, etwas schneller zu lesen und auszuführen. –

+0

@ TadhgMcDonald-Jensen: Ausgezeichneter Vorschlag. Implementiert. – zondo

0

Sie auch die Zeichenfolge bekommen kann vor und nach der Teilkette mit .split() dann Teilen des beide zurück:

def get_sub_and_surrounding(string,sub,length): 
    before,after = string.split(sub,1) #limit to only one split 
    return before[-length:] + sub + after[:length] 

es ist erwähnenswert, dass in diesem Fall, wenn sub ist nicht wirklich ein Teil dann wird die erste Zeile ein ValueError

erhöhen, aber Sie können die genaue Indizes für das Aufspalten es auf wie diese:

def get_sub_and_surrounding(string,sub,length): 
    i_start = string.index(sub) #index of the start of the substring 
    i_end = i_start + len(sub) #index of the end of the substring (one after) 

    my_start = max(0, i_start -length) 
    # ^prevents use of negative indices from counting 
    # from the end of the string by accident 

    my_end = min(len(string), i_end+length) #this part isn't actually necessary, "a"[:100] just goes to the end of the string 

    return string[my_start : my_end] 

In diesem Fall wird string.index(sub) eine ValueError auslösen, wenn sub nicht in der Zeichenfolge ist.