2012-02-09 2 views
0

문자열이 있습니다.이 정규식을 어떻게 파이썬으로 작성해야합니까?

st = "12345 hai how r u @3456? Awer12345 7890" 
re.findall('([0-9]+)',st) 
처럼

그것은 오지한다 : 나는

['12345','7890'] 

난 단지

그것은 포함 할 수 없습니다 숫자 값을 취해야을 얻어야한다

['12345', '3456', '12345', '7890'] 

다른 문자들 알파벳과 같은 특수 문자

+1

'[0-9] =='+ '\'+ d를 – juliomalegria

답변

2
In [21]: re.findall(r'(?:^|\s)(\d+)(?=$|\s)', st) 
Out[21]: ['12345', '7890'] 

,

  • (?:^|\s)

    문자열 또는 공백의 시작과 일치하는 비 캡처 그룹입니다 바랍니다.
  • (\d+)은 하나 이상의 숫자와 일치하는 캡처 그룹입니다.
  • (?=$|\s)은 문자열의 끝 또는 공백 인 과 일치하는 lookahead 어설 션으로, 사용하지 않고입니다.
+2

@ Ademiban의 해결책과 같은 문제 : 첫 번째 경기에서 내부 공간이 "소모"되기 때문에 '123 456'에 '456'이 없습니다. –

+0

@ JanPöschko : 잘 했어, 고마워. 고정 (최종 그룹을 미리보기 주장으로 변환). – NPE

+0

@ JanPöschko 감사합니다. 이 "12345 hai how r u @ 3456? Awer12345 7890123ER % 345 234 456 789" – Nava

2

사용 : (^|\s)[0-9]+(\s|$) 패턴. (^|\s)은 숫자가 문자열의 시작 부분에 있어야하거나 번호 앞에 공백 문자가 있어야 함을 의미합니다. (\s|$)은 숫자 뒤에 공백이 있어야하거나 숫자가 문자열 끝에 있음을 의미합니다.
Jan Pöschko가 말한 것처럼 456은 123456에서 발견되지 않습니다. "나쁜"부분 (@, Awer)이 항상 접두어 인 경우이 (^|\s)[0-9]+ 패턴을 사용할 수 있으며 모든 것이 정상입니다. 문자열 앞에 공백 만 있거나 공백 문자의 시작 부분에있는 모든 숫자와 일치합니다. ...이 도움이 여기에

+1

이 WI '123 456'에서 '456'을 찾지 않을 것입니다. 왜냐하면 내부 공간이 첫 번째 경기에서 "소비"되기 때문입니다. –

+0

당신 말이 맞아요 ... – shift66

11

정규 표현식을 사용할 필요가 없습니다에 관계없이 그들을 둘러싸고 무엇을, 나는 훨씬 더 읽기 정규식

+0

'i.isdigit()'... nice. – phimuemue

+0

정규식을 사용하지 않는 경우 +1. – shift66

0

귀하의 표현을 사용하는 것보다 생각

[i for i in st.split(" ") if i.isdigit()] 

이 자리의 모든 시퀀스를 발견합니다. 순서의 전후에 오는 사양을 포함시켜야 원하는 동작을 얻을 수 있습니다.

re.findall(r"[\D\b](\d+)[\D\b]", st) 

원하는대로 할 수 있습니다. 영어로, 그것은 "숫자가 아닌 문자로 둘러싸인 하나 이상의 숫자의 모든 시퀀스와 일치합니다.또는 단어 경계 "

+0

[ '12345', '7890']을 원할 때 [ '3456', '12345']를 반환합니다. 나는 정규 표현식이 사소하지 않다면 정규 표현식이 가치가있는 것보다 더 큰 문제가된다는 나의 견해에 대해 더욱 확신한다. – DSM

3

코리의 솔루션은 정말 여기 올바른 방법이지만, 문제는 정규식을 요청 않았기 때문에, 여기에 내가 다른 사람보다 간단하다고 생각 정규식 솔루션입니다 :

re.findall(r'(?<!\S)\d+(?!\S)', st) 

가 그 설명 :

(?<!\S) # Fail if the previous character (if one exists) isn't whitespace 
\d+  # Match one or more digits 
(?!\S) # Fail if the next character (if one exists) isn't whitespace 

일부 예 :

>>> re.findall(r'(?<!\S)\d+(?!\S)', '12345 hai how r u @3456? Awer12345 7890') 
['12345', '7890'] 
>>> re.findall(r'(?<!\S)\d+(?!\S)', '12345 hai how r u @3456? Awer12345 7890123ER%345 234 456 789') 
['12345', '234', '456', '789'] 
+0

+1 트위스트 더블 네가티브 로직. 사악한. :) – zx81

관련 문제