Die bestehenden Lösungen auf Basis von findall
sind in Ordnung für nicht überlappende Streichhölzer (und ohne Zweifel optimal außer vielleicht für große Anzahl von Spielen) zurückkehren, obwohl Alternativen wie sum(1 for m in re.finditer(thepattern, thestring))
(um zu vermeiden, jemals die Liste materialisieren, wenn alles, was Sie interessieren, ist die Zählung) sind auch durchaus möglich. Etwas eigenwillig subn
und ignorieren würde den resultierenden String mit ...:
def countnonoverlappingrematches(pattern, thestring):
return re.subn(pattern, '', thestring)[1]
die einzige wirkliche Vorteil dieser letztere Idee kommen würde, wenn Sie (sagen wir) bis zu 100 Spiele zählen betreut; dann könnte re.subn(pattern, '', thestring, 100)[1]
praktisch sein (100 zurückgeben, ob es 100 Übereinstimmungen gibt, oder 1000 oder sogar größere Zahlen).
Zählen Überschneidungen Übereinstimmungen müssen Sie mehr Code schreiben, weil die integrierten Funktionen in Frage alle auf nicht überlappende Übereinstimmungen konzentriert sind. Es gibt auch ein Problem der Definition, z. B. mit Muster sein 'a+'
und Thesestring 'aa'
, würden Sie dies als nur ein Spiel, oder drei (die erste a
, die zweite, beide von ihnen), oder ...?
zum Beispiel Angenommen, die Sie wollen möglicherweise überlappende Streichhölzer in der Zeichenfolge an bestimmten Stellen beginnen (die dann zwei Spiele für das Beispiel im vorherigen Absatz ergeben würden):
def countoverlappingdistinct(pattern, thestring):
total = 0
start = 0
there = re.compile(pattern)
while True:
mo = there.search(thestring, start)
if mo is None: return total
total += 1
start = 1 + mo.start()
Beachten Sie, dass Sie tun müssen das Muster in einem RE-Objekt in diesem Fall kompilieren: Funktion re.search
akzeptiert kein start
Argument (Startposition für die Suche) die Art und Weise Methode tut, also müssten Sie Strings schnitzen wie Sie gehen - definitiv mehr Aufwand als nur die nächste Suche s tart beim nächstmöglichen Startpunkt, was ich in dieser Funktion mache.
Müssen Sie überlappende Übereinstimmungen zählen? Ist der Regex "Freund eines Freundes" ein- oder zweimal in der Zeichenfolge "Freund eines Freundes eines Freundes"? –
Ich brauche Überlappung. – Dan
Sie brauchen eine Überlappung? Wenn also das Übereinstimmungsmuster "aa" lautet und die Quellzeichenfolge "aaaa" lautet, lautet die richtige Antwort 3? – steveha