2016-07-01 2 views
9

주어진 문자열과 숫자를 구분하는 정규식이 있습니다.파이썬을 사용하여 마지막으로 발생하는 숫자를 분리하는 정규 표현식

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

출력은

testuser 

하지만 사용자 이름은 내가 다음과 같은 출력이 예상된다

testuser 

을 얻고있다

username = "testuser1-1" 

아래 같은 경우. 하지만 다음을 찾고 있는데

testuser1- 

기본적으로 정규 표현식은 마지막으로 발생하는 정수 (개별 숫자 아님)를 구분해야합니다.

요약

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

내가 모든 경우 위 다루는 하나의 정규 표현식을 가질 수있다 ..?

+0

하이 Hearner, I 추가 한 제 케이스 더 나은 이해. 한번 봐주세요. – user3157132

+0

@Hearner 그가 마지막자를 삭제하려고한다고 생각합니다. – Caridorc

+0

lookebhind를 사용하여 마지막 비 숫자 : ['^. * (?

답변

6

당신은 re.sub를 사용하여 구문 뒤에 볼 수 있습니다 :

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

더 짧은 버전 :

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

sub 기능은이 경우에 더 적합합니다.

테스트 케이스 : 여기

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

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

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

룩백 부분이 필요하지 않습니다. '\ d + $'이면 충분하다. – melpomene

+0

@ 멜 포메 네 음.나는 항상 그것이 필요로하는 것보다 더 복잡한 것을 선호하는 것처럼 보인다 : – Psidom

+0

입력을 검증하지는 않았지만 Up-voted. – revo

-2

끝에서부터 시작하여 각 문자를 삭제하고 첫 번째 숫자가 아닌 숫자에서 중지하는 것이 좋습니다.

+0

마지막 예제에서는 작동하지 않습니다. – melpomene

+0

@Caridoc, 답변 해 주셔서 감사합니다. 그러나 세 번째 경우에는 작동하지 않습니다. 사용자가 testuser1-2000이면 testuser1-200을 반환하지만 testuser1- – user3157132

+0

@user3157132를 찾고 있습니다. 최종 번호가 – Caridorc

1

!

re.match 사용
regex_ = '\w+-?(?:\d+)?' 
+0

이것은 간단한 문제에 대한 불필요한 복잡성처럼 보입니다. –

+0

오른쪽! 그러나 그것이 OP가 원하는 것입니다! – wolframalpha

+0

'testuser-1-11111-2222'와 같은 문자열에서는 실패합니다. –

5

용액 :뿐만 아니라 대 (단 토큰 - 고려)

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

적은 엔진 포함 정규식

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