GOOGLE ADS

Samstag, 23. April 2022

Aufteilen von Zeichenfolgen durch eine Liste von Trennzeichen, unabhängig von der Reihenfolge der Trennzeichen

Ich habe einen String text und eine Liste names


  • Ich möchte textjedes Mal teilen, wenn ein Element von namesauftritt.

  • Ich möchte, dass die Reihenfolge der Trennzeichen irrelevant namesist, da diese mehrmals vorkommen könnentext

  • Ich möchte eine Liste von Listen erstellen, in der jedes Split text-Slice dem Trennzeichen entspricht, durch das es geteilt wurde.


Beispiel:

text = 'Monika goes shopping. Then she rides the bike. Mike likes Pizza. Monika hates me.'

names = ['Mike', 'Monika']

gewünschte Ausgabe: (Reihenfolge der Listen ist nicht wichtig)

output = [['Monika', ' goes shopping. Then she rides the bike.'], ['Mike', ' likes Pizza.'], ['Monika', ' hates me.']]

Hilfe:

Ich denke, jemand hatte hier bereits ein ähnliches Problem: https://stackoverflow.com/a/4697047/14648054

def split(txt, seps):
default_sep = seps[0]
for sep in seps[1:]: # skip seps[0] as the default separator
txt = txt.replace(sep, default_sep)
return [i.strip() for i in txt.split(default_sep)]

und hier: https://stackoverflow.com/a/2911664/14648054

def my_split(s, seps):
res = [s]
for sep in seps:
s, res = res, []
for seq in s:
res += seq.split(sep)
return res
print my_split('1111 2222 3333;4444,5555;6666', [' ', ';', ','])
['1111', '', '2222', '3333', '4444', '5555', '6666']

re.split()lässt mich keine Liste als Trennargument verwenden. Kann ich re.compile()meine Trennzeichen irgendwie auflisten?


Lösung des Problems

Ihr Beispiel entspricht nicht vollständig Ihrer gewünschten Ausgabe. Außerdem ist nicht klar, ob die Beispieleingabe immer diese Struktur haben wird, z. B. mit dem Punkt am Ende jedes Satzes.

Trotzdem möchten Sie vielleicht diesen schmutzigen Ansatz ausprobieren:

import re
text = 'Monika will go shopping. Mike likes Pizza. Monika hates me.'
names = ['Ruth', 'Mike', 'Monika']
rsplit = re.compile("|".join(sorted(names))).split
output = []
sentences = text.split(".")
for name in names:
for sentence in sentences:
if name in sentence:
output.append([name, f"{rsplit(sentence)[-1]}."])
print(output)

Dies gibt aus:

[['Mike', ' likes Pizza.'], ['Monika', ' will go shopping.'], ['Monika', ' hates me.']]

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...