2016-07-01 99 views
9

Ho un'espressione regolare che separa il numero dalla stringa specificata.Espressione regolare per separare l'ultimo numero che si verifica utilizzando Python

username = "testuser1" 
xp = r'^\D+' 
ma = re.match(xp, username) 
user_prefix = ma.group(0) 
print user_prefix 

uscita è

testuser 

Ma se il nome utente è qualcosa di simile al di sotto

username = "testuser1-1" 

Sto ottenendo il seguente output

testuser 

che si prevede. Ma sto cercando il seguente

testuser1- 

Fondamentalmente l'espressione regolare deve separare l'ultimo numero intero che si sta verificando (non le singole cifre).

Sintesi è

input = "testuser1" 
>>> output = testuser 
input = "testuser1-1" 
>>> output = testuser1- 
input = "testuser1-2000" 
>>> output = testuser1- 

posso avere una singola espressione regolare a che fare con quanto sopra tutti i casi ..?

+0

Ciao Hearner, ho aggiunto terzo caso anche per miglior comprensione. Per favore guarda. – user3157132

+0

@Hearner Penso che voglia cancellare l'ultimo carattere se è una cifra. – Caridorc

+0

È anche possibile abbinare fino all'ultimo non cifra: ['^. * (?

risposta

6

È possibile utilizzare re.sub e guarda dietro la sintassi:

re.sub(r'(?<=\D)\d+$', '', username) 

Una versione più breve:

re.sub(r'\d+$', '', username) 

La funzione sub è più adatto per questo caso.

Casi di test:

re.sub(r'\d+$', '', "testuser1-100") 
# 'testuser1-' 

re.sub(r'\d+$', '', "testuser1-1") 
# 'testuser1-' 

re.sub(r'\d+$', '', "testuser1") 
# 'testuser' 
+1

Non hai bisogno della parte del look-behind. '\ d + $' è abbastanza. – melpomene

+0

@melpomene Bene.Sembra che io preferisca sempre rendere le cose più complicate di quanto non sia necessario :) – Psidom

+0

Up-votato anche se non convalida l'input. – revo

-2

Suggerisco di partire dalla fine, cancellando ogni carattere e fermandosi al primo non numerico.

+0

Questo non funziona per l'ultimo esempio. – melpomene

+0

@ Caridoc, grazie per la risposta. Ma non funzionerà per il terzo caso. Se l'utente è testuser1-2000, restituisce testuser1-200, ma sto cercando testuser1- – user3157132

+0

@ user3157132 ok, sebbene tu fossi interessato in un unico numero finale – Caridorc

1

Qui!

regex_ = '\w+-?(?:\d+)?' 
+0

Questa sembra una complicazione inutile per un semplice problema. –

+0

Giusto! Ma questo è ciò che OP vuole! – wolframalpha

+0

Questo fallirà per stringhe come 'testuser-1-11111-2222' –

5

Una soluzione con re.match:

import re 
username = "testuser1" 
xp = r'^(.+?)\d+$' 
ma = re.match(xp, username) 
user_prefix = ma.groups()[0] 
user_prefix 
# 'testuser' 

# you can also capture the last number 
xp = r'^(.+?)(\d+)$' 
ma = re.match(xp, username) 
user_prefix, user_number = ma.groups() 
user_prefix, user_number 
# ('testuser', '1') 

print re.match(xp, "testuser1-2000").groups() 
# ('testuser1-', '2000') 
re.match(xp, "testuser1-2000").groups()[0] 
# 'testuser1-' 
re.match(xp, "testuser1-2000").group(1) 
# 'testuser1-' 
1

Meno motore regex che coinvolge (considerando - come unico pegno)

^([^\s-]+-|\D+)