2017-03-06 2 views

Antwort

0

Sie können dies versuchen:

(?<=\b)\d+(?=[\s.,;]) 

Erklärung:

  1. (?<=\b) Blickt von der aktuellen Posi tion, wenn es ein Anfang eines Wortes
  2. \d+ Wenn vorherige Bedingung wahr gefunden wird, dann Ziffern übereinstimmt \ d +
  3. (?=[\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.

+0

Warum legen Sie die Wortgrenze in einem Lookbehind? Und warum nicht ein Wordboundary hinter den Ziffern? – Toto

+0

@Toto Ich habe den Grund erwähnt, in der Antwort jetzt –

+0

'\ b (\ d {2}) \ b 'ist genug als OP will nur 2 Ziffern. Und in der Tat ist das Wortgrenzen ein Blickfeld. – Toto

Verwandte Themen