문제

이것은 어리석은 질문 일 수 있지만 ...

다음과 같은 문장이 있습니다.

빠른 갈색 여우

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

빠른 갈색 여우가 게으른 개 위에 뛰어 왔습니다

Simple Regexp (\ w *)는 첫 번째 단어 "the"를 찾아 그룹에 넣습니다.

첫 번째 문장의 경우 각 단어를 자체적으로 넣으려면 \ w * (\ w *) \ s * (\ w *) \ s * (\ w *) \ s *를 쓸 수 있습니다. 그룹,하지만 문장의 단어 수를 알고 있다고 가정합니다.

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

나는이 일을 파이썬에서하고 있으며, 내 유스 케이스는 분명히 "빠른 갈색 여우"보다 조금 더 복잡하다. 그래서 정규식이 한 줄로이 일을 할 수 있다면 멋지게 될 것입니다. 다음 최상의 솔루션은 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']
.

도움이 되었습니까?

해결책

나는 그것이 가능하다고 믿지 않는다.regexes는 주어진 정규 표현식에서 캡처를 괄호로 쌍을 짝을 짝을 짝을 짝을 짝을 짝을 짝을 짝을 짝을 짝을 짝을 지정합니다. '((\ w +) \ s +) {0,99}'만큼 반복적으로 캡처 할 것입니다.두 번째 그룹 ... 각 경기가 발견 된 새 그룹을 만들지 마십시오.

스플릿을 사용할 수 있지만 한 문자 값에서만 공백과 같은 문자가 아닌 하나의 문자 값에만 분할됩니다.

대신 정규 표현식에서 분할 할 수있는 re.split을 사용할 수 있으며 공백을 일치시킬 수 있습니다.당신은 아마 '\ 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']
>>>
.

다른 팁

모듈 RE

에서 함수 findAll을 사용할 수도 있습니다.
import re
>>> re.findall("\w+", "The quick brown fox")
['The', 'quick', 'brown', 'fox']
.

string.split 똑같은 일을 할 때 regex를 사용하는 이유는 무엇입니까?

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

정규 표현식은 알 수없는 그룹 수로 그룹화 할 수 없습니다.그러나 귀하의 경우에 희망이 있습니다.'분할'방법을 살펴보십시오. 귀하의 경우에 도움이되어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top