2013-11-03 3 views
0

저는 정규식을 사용하여 파이썬에서 다른 모든 단어와 일치하는 솔루션을 찾으려고 노력했습니다. 문자열은 알 수없는 길이로 쉼표로 구분됩니다. 나는 목록으로 일치하는 모든 단어를 유지할 수 있도록하고 싶습니다Python Regex는 다른 모든 단어와 일치합니다.

"keep, ignore, keep_this_too, ignore, keep_this_also, ignore" 

:

내가 다음 문자열을 말해봐. 다음 대신 난 그냥 마지막 단어 만 모든 것을 얻을, 일치하는 모든 단어를 인쇄에 시도

result = re.match(regex, string) 
print result.group(keep) 

를 사용

((?P<keep>.*),)* 

:

나는 나의 정규식을 작성했습니다.

감사

편집 :

내가 어떤 파이썬 문자열 작업을 사용할 수 없습니다. 이것의 목표는 연구자가 제공하는 데이터 형식을 지원하는 것입니다. 이렇게하려면 각 형식에 대해 정규 표현식을 데이터베이스에 저장하고 있습니다. 우리는 다음과 같은 정규식 사용해야 할 경우 예를 들어, 그들은 데이터 형식을 제공 할 수있다 :

"keep (ignore), keep (ignore), keep (ignore)" 
+0

단어에 공백이있을 수 있습니까? 즉, "1, 2, 큰 데이터, 4, 5"가 있다면? –

+0

@RayToal 그러면 단어가 아닐 것입니다. – Bakuriu

+0

감사합니다. 용어가 _comma로 분리되어 있다고 말했기 때문에 확인 만합니다. 그러나 당신은 여전히 ​​더 명확하게 할 수 있습니까? 그래서 공백으로 단어를 분리 할 수 ​​있습니까? 아니면 그냥 쉼표 또는 그냥 공백? 그것은 차이를 만든다. –

답변

2

.* 일치 탐욕 (일치하는 모든 가능한 경우); .*,은 마지막까지 ,까지 모든 것을 일치시킵니다. 비 탐욕심과 일치하려면 .*?을 사용하십시오.

그리고 re.match은 첫 번째 일치 항목 만 반환합니다. (그리고 입력 문자열의 시작 부분에서만 일치 함). 수정 된 정규 표현식으로 re.findall를 사용

(search() vs match() 참조) :

>>> s = "keep, ignore, keep_this_too, ignore, keep_this_also, ignore" 
>>> re.findall(r'([^,\s]+)', s) 
['keep', 'ignore', 'keep_this_too', 'ignore', 'keep_this_also', 'ignore'] 
>>> re.findall(r'([^,\s]+)', s)[::2] # using slice to get every other matches. 
['keep', 'keep_this_too', 'keep_this_also'] 

또는 :

>>> re.findall(r'([^,\s]+)(?:,\s*[^,\s]+)?', s) 
['keep', 'keep_this_too', 'keep_this_also'] 
+0

응답 해 주셔서 감사합니다. 그러나 문자열 연산 (스플 라이스)을 사용하고 싶지 않습니다. – dajee

+0

@David 그런 다음're.findall'을 사용하는 마지막 코드를 사용하십시오. BTW'[.. : .. : ..]'는 조각이라고 부릅니다. – falsetru

+0

나는 사과한다 나는 두 번째 부품을 보지 않았다, 나는 이것을 시험해 볼 것이다. – dajee

0

정규 표현식에 이미 단어에 표시 할 수있는 문자 정의, 즉 \w는 집합을 의미한다. 는 따라서 :

In [1]: import re 
    ...: re.findall('\w+', "keep, ignore, keep_this_too, ignore, keep_this_also, ignore") 
    ...: 
Out[1]: ['keep', 'ignore', 'keep_this_too', 'ignore', 'keep_this_also', 'ignore'] 

당신이 깔끔히 간단하게 사용하는 다른 모든 일치를 무시하려는 경우 :

당신이 keep (또는 다른 문자열)로 시작하는 캐릭터 라인 만 유지하려면
In [2]: ['keep', 'ignore', 'keep_this_too', 'ignore', 'keep_this_also', 'ignore'][::2] 
Out[2]: ['keep', 'keep_this_too', 'keep_this_also'] 

, 단순히를 사용 패턴 keep\w* 대신 \w+ :

In [4]: re.findall('keep\w*', "keep, ignore, keep_this_too, ignore, keep_this_also, ignore") 
Out[4]: ['keep', 'keep_this_too', 'keep_this_also'] 

당신이 일치하려고하는 것은 정말 단어가 아닌 경우, 공백, 구두점 등의 문자를 포함 할 수 있습니다. 위의 정규 표현식에서 \w[^,]으로 대체하면 쉼표 이외의 모든 문자와 일치시킬 수 있습니다.

1

.split()을 여전히 데이터베이스에 저장할 수 있습니까?

String="keep, ignore, keep_this_too, ignore, keep_this_also, ignore" 
String.split(",")[0::2] 

출력 :

['keep', ' keep_this_too', ' keep_this_also'] 
0

당신은 사용할 수 뭔가 같은 :

import re 
re.findall("([^,]*), [^,]+[,]{0,1}", "keep, ignore, keep_this_too, ignore, keep_this_also, ignore") 

그러나 단지 결과 분할을 사용하여 슬라이스없는 이유 :

"keep, ignore, keep_this_too, ignore, keep_this_also, ignore".split(",")[0::2] 
0

당신이 필요를 :

s = ' keep, ignore, keep_this_too , ignore, keep_this_also, ignore ' 
print(s.replace(' ','').split(',')[0::2]) 

수율 :

['keep', 'keep_this_too', 'keep_this_also'] 
0

이?

>>> s = "keep, ignore, keep_this_too, ignore, keep_this_also, ignore" 
>>> import re 
>>> re.findall(r'(\w+)\W+\w+', s) 
['keep', 'keep_this_too', 'keep_this_also'] 
관련 문제