Sie können dies versuchen:
(?<=\b)\d+(?=[\s.,;])
Erklärung:
(?<=\b)
Blickt von der aktuellen Posi tion, wenn es ein Anfang eines Wortes
\d+
Wenn vorherige Bedingung wahr gefunden wird, dann Ziffern übereinstimmt \ d +
(?=[\s.,;])
Wenn vorherige Bedingung erfüllt, dann nach vorne schauen, um zu sehen, ob es mit dem Raum oder ein Punkt oder Komma endet oder Semikolon
demo
wenn ich Wortgrenze setzen nach Ziffern dann 1999 @ wird auch ausgewählt bekommen. Dargestellt in der Demo
Beispielcode:
import re
regex = r"(?<=\b)\d+(?=[\s.,;])"
test_str = "Hi I am sony. My age 23. This is my email id [email protected] . Hi I am Jessey. My age 20. This is my email id [email protected] . Hi I am ronald.My age 17 My mail id is [email protected]"
matches = re.finditer(regex, test_str, re.MULTILINE)
for match in matches:
print(match.group(0))
Run it here
UPDATE
\ b Wortgrenze gewährleistet. Ich habe (? < = \ b) am Anfang gesetzt, was ähnlich ist wie \ b. Also über die Regex ist die gleiche wie:
\b\d+(?=[\s.,;])
Hier Der erste \ b stellt sicher, dass jede passende nur von einem Start eines Wortes beginnen. Wo Anfang eines Wortes kurz nach (Punkt), (Komma),; (Semikolon), Leerzeichen, Tab usw.
Warum legen Sie die Wortgrenze in einem Lookbehind? Und warum nicht ein Wordboundary hinter den Ziffern? – Toto
@Toto Ich habe den Grund erwähnt, in der Antwort jetzt –
'\ b (\ d {2}) \ b 'ist genug als OP will nur 2 Ziffern. Und in der Tat ist das Wortgrenzen ein Blickfeld. – Toto