2010-07-08 3 views
3

이것은 ... 바보 같은 질문이 될 수도 있지만 문장에서 각 단어에 대한 그룹을 만드는 방법은 무엇입니까?

은 같은 문장을 말해봐 :

빠른 갈색 여우

또는 당신은 같은 문장을 얻을 수 있습니다 :

게으른 개를 뛰어 넘은 빠른 여우

간단한 regexp (\ w *)는 첫 번째 단어 "The"를 찾아 그룹에 넣습니다.

첫 번째 문장의 경우 \ s * (\ w *) \ s * (\ w *) \ s * (\ w *) \ s * 자신의 그룹,하지만 그 문장의 단어의 수를 알고 있다고 가정합니다.

임의의 문장에있는 각 단어를 자체 그룹으로 묶는 정규 표현식을 작성할 수 있습니까? (? :(\ w *) \ s *) * 같은 것을 할 수 있으면 (\ w *)의 각 인스턴스를 그룹화 할 수 있으면 좋겠지 만 작동하지 않습니다.

파이썬에서이 작업을하고 있는데, 사용 사례가 "The quick brown fox"보다 조금 복잡하기 때문에 Regex가 한 줄에서이 작업을 수행 할 수 있다면 멋지 겠지만 가능하지 않다면 re.findall() 같은 것을 사용하여 모든 일치를 반복하는 것이 최선의 해결책이라고 가정합니다.

당신이 가진 통찰력에 감사드립니다.

편집 : 완성을 위해 여기에 내 실제 사용 사례가 있으며 어떻게 당신의 도움을 받아 해결 했습니까? 다시 한번 감사드립니다.

>>> s = '1 0 5 test1 5 test2 5 test3 5 test4 5 test5' 
>>> s = re.match(r'^\d+\s\d+\s?(.*)', s).group(1) 
>>> print s 
5 test1 5 test2 5 test3 5 test4 5 test5 
>>> list = re.findall(r'\d+\s(\w+)', s) 
>>> print list 
['test1', 'test2', 'test3', 'test4', 'test5'] 
+0

재 모듈의 기능 findall은을 사용할 수 있습니다. 한 번에 모든 단어를 일치시키고 캡처 할 수 있는지 확신하지 못합니다. – Borealid

+0

.NET은 일치하는 그룹에 의해 반복 캡처를 유지합니다. 지금까지 그 맛은 독특하다고 생각합니다. – polygenelubricants

+0

알아두면 좋을 것, 나는 때때로 C#을 사용하고 그것을 염두에두고있을 것입니다. 해당 기능의 모든 문서에 대한 링크가 있습니까? – blah238

답변

5

나는 그것이 가능하다고 생각하지 않습니다. Regexes는 주어진 정규 표현식에서 괄호로 캡처를 연결합니다. '((\ w +) \ s +) {0,99}'와 같이 하나의 그룹 만 나열하면 반복적으로 동일한 첫 번째 및 두 번째 그룹 ... 발견 된 각 일치에 대해 새 그룹을 만들지 않습니다.

split을 사용할 수는 있지만 공백과 같은 문자 클래스가 아닌 한 문자 값으로 만 분할됩니다.

대신 정규식으로 나눌 수있는 re.split을 사용하고 공백과 일치하도록 '\ s'를 지정할 수 있습니다. greetily 공백을 수집하기 위해 '\ s +'와 일치 시키길 원할 것입니다.

>>> import re 
>>> help(re.split) 
Help on function split in module re: 

split(pattern, string, maxsplit=0) 
    Split the source string by the occurrences of the pattern, 
    returning a list containing the resulting substrings. 

>>> re.split('\s+', 'The quick brown\t fox') 
['The', 'quick', 'brown', 'fox'] 
>>> 
+0

감사합니다. 제가 결론을 내린 것은 다소 다릅니다. – blah238

3

string.split이 같은 일을하는 이유는 무엇입니까?

>>> "The quick brown fox".split() 
['The', 'quick', 'brown', 'fox'] 
+0

주로 사용 사례가 약간 더 복잡하기 때문에 Regex가 가장 적합 할 것 같습니다. >>> 1 0 5 TEST1 5 TEST2 5 TEST3 5 TEST4 5 test5 여기서 은 내가 실제로 할 노력하고있어 같은 같은 문자열에서 등 TEST1, TEST2, TEST3, 각각의 인스턴스를 얻을 수있다 ("x testn")은 여러 번 반복 될 수 있습니다. "x"는 "testn"의 문자 수이고 앞에있는 "1 0"은 쓸모없는 쓰레기입니다. – blah238

1

정규 표현식은 알 수없는 그룹 수로 그룹화 할 수 없습니다. 그러나 당신의 경우에 희망이 있습니다. '분할'방법을 살펴보면, 귀하의 경우 도움이 될 것입니다.

6

는 또한 위의 "\ S +"당신이 넣을 때마다 "\ *이이야"나는 당신이 원하는 생각

import re 
>>> re.findall("\w+", "The quick brown fox") 
['The', 'quick', 'brown', 'fox'] 
관련 문제