2014-05-14 2 views
3

나는이파이썬 정규식 지원

24 (prem)-42-48 (6 ext)

와 내가 그것을 밖으로 싶어처럼 보이는 문자열

['24 prem', '42', '48', '6 ext']

내가 이런 식으로 숫자를 얻을 수있다있다 :

import re 
MyString = r'24 (prem)-42-48 (6 ext)' 
Splits = re.findall(r'(\d+)', MyString) # ['24','42','48','6'] 

하지만 나는 딩 텍스트.

import re 
MyString = r'24 (prem)-42-48 (6 ext)' 
Splits = re.findall(r'[\\s:\\-]', MyString) # ['24 (prem)','42', '48 (6 ext)'] 

을하지만 그건 (6 ext) 항목이 골대를 벗어났습니다 :

나는 또한이 작업을 수행 할 수 있습니다. 보고 응답 후

편집 :

나는 아마 내가 번호를 분할 한 후 바로 "("와 ""문자를 제거하는 str.replace을 사용하는 것이 문제를 처리하는 가장 간단한 방법을 생각한다.

따라서, 다수의 첫 번째 문자 전에 문자열을 분할하는 간단한 정규식 문이있다?

결과를

'24 (prem)-42-48 (6 ext)'

에을 수행

, 당신은 regexps '에 필요하지 않는 결과를 얻을 수

['24 (prem)-','42-',48 (', '6 ext)]

+1

그래서 * 패턴은 무엇입니까? 여기에 하나의 입력 + 예상 출력 줄을 입력했으나 입력 내용이 어떻게 달라질 수 있는지에 대해서는 설명하지 않았습니다. –

+1

마지막 패턴도 유효하지 않습니다. 그 코드 행은'[ '-', '-']'를 생성하고 모든 역 슬래시, 콜론, 대시를 문자''s ''로 찾습니다. –

+2

마지막으로, 샘플 출력은 a) 파이썬이 아니며, b) 정규 표현식으로는 불가능합니다. ''24 ','prem ','42 ','48 ','6 ext ']'는 가능하지만'24 prem''이 첫 번째 요소는 아닙니다. –

답변

2

것, 당신이 공백을 대체하여 원하지 않는 문자를 제거하기 만하면 공백의 문자열 분할의 모든 :

을 여기
>>> s.translate(s.maketrans("()-", " ")).split() 
['24', 'prem', '42', '48', '6', 'ext'] 

이 버전?입니다 :
>>> s ="24 (prem)-42-48 (6 ext)" 
>>> l = s.replace('(',' ').replace('-',' ').replace('(',' ').replace(')',' ').split() 
>>> l 
['24', 'prem', '42', '48', '6', 'ext'] 

여기 python3에 대한 번역 사용하여 버전입니다 N 사용으로 정규 표현식 :하지만

>>> list(filter(lambda x: x is not '', re.findall('[^-() ]*', s))) 
['24', 'prem', '42', '48', '6', 'ext'] 

, 나는 그렇지 않으면 당신이 원하는 일을 할 일반적인 방법은 수행하여이를 달성 할 수 있지만,이 없다, 결과 목록에서 '24 prem''6 ext'은 당신이 만든 오타 것을 고려하고 :

>>> [" ".join(l[:2])] + l[2:-2] + [" ".join(l[-2:])] 
['24 prem', '42', '48', '6 ext'] 
+0

정규 표현식 솔루션을 추가 할 가치가 있습니다. 그는 단지're.findall ([^ -()] *)'을 찾는 것처럼 보입니다. 나는 응답을 고려하고 있었다. 그러나 나는 str.translate (table [, deletechars])를 사용하여 –

+3

을 추가하는 것이 중요하지 않다고 생각한다. 더 좋은 방법은 여러 문자를 삭제하는 것이다. 파이썬 워드 프로세서의 예제는 >>> '이 짧은 텍스트를 읽으십시오. 번역본 (없음,'aeiou ') 'rd ths shrt txt '- 포맷이 망가진 것을 알고 있지만, 희망을 얻었습니다. –

+1

@GaryWalker는 파이썬 2에서는'string.translate'이고 파이썬 3에서는'str.translate'이지만 파이썬 3은 선택적'deletechars' 인수를 허용하지 않습니다. Python3 –

0

문자열 형식에 대한 추측을해야했지만 여기에는 일치하는 정규식이 있습니다. 당신이 그룹화) "("와 "("문자 일치 (사용 ... 알 수 있습니다

regex = re.compile(r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)') 

당신은 텍스트의 큰 블록에서 선 또는 여러 경기에서 하나의 일치를 찾을 수 있습니다.

>>> regex=r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)' 
>>> re.findall(regex,lines) 
[('24', 'prem', '42', '48', '6', 'ext'), ('25', 'prex', '43', '48', '7', 'ext')] 
>>> regex= re.compile(r'(\d+) \(([a-zA-Z]+)\)-(\d+)-(\d+) \((\d+) ([a-zA-Z]+)\)') 
>>> line='24 (prem)-42-48 (6 ext)' 
>>> regex.match(line).groups() 
('24', 'prem', '42', '48', '6', 'ext') 
>>> lines="""24 (prem)-42-48 (6 ext) 
... 25 (prex)-43-48 (7 ext) 
... """ 
>>> regex.findall(lines) 
[('24', 'prem', '42', '48', '6', 'ext'), ('25', 'prex', '43', '48', '7', 'ext')] 
>>> 
+0

이것은 내가 입력 한 내용을 바탕으로 훌륭하게 작동하지만 게시하지 않은 다른 입력에서 데이터를 추출하는 데는 효과가 없습니다. 불완전한 문제 진술서를 제출해 주셔서 죄송합니다. – nickvans

+0

@nickvans - 문제 없습니다. 이것은 단지 출발점으로 의도되었습니다. – tdelaney