2017-11-14 1 views
2

나는 여러 명령을 사용하는 봇을 가지고 있으며이 명령에 대해 인수를 취할 수있는 기능을 확장하려고합니다. 내가 처리 명령이 기능 만 해제 확장 정규식이 지금특정 문자열 다음에 Regex infinine 캡쳐 그룹

!action db_table mandatory_arg arg1 arg2 arg3... 

:

는 구문입니다

^!(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)\s?(\S*)$ 

그것은 작동하지만 위대한 아니에요 그리고 그것은 분명히 제한 있어요 얼마나 많은 \ S * 거기에 추가 할 수 있습니다.

그럼 다음 문자열에서 무제한의 인수를 어떻게 일치시킬 수 있습니까?

!dont match this match1 match2 match3 match4 etc... 

나는 lookbehind를 사용해 보았지만 첫 번째 경기에서만 작동합니다. 또한 첫 번째 부분을 완전히 무시한 채로 다시 시도했지만, 다른 부분도 해당 특정 무시를 찾고 있기 때문에 첫 번째 인수에 대해서만 작동합니다.

마지막으로 나는 또한 \ K 샷을 주었지만 제대로 작동하지 않았습니다.

!\w+\s\w+\s\w+\s\K(\S*)* 
+0

왜'.split()'를 사용하지? – Jan

+0

PyPi regex 라이브러리를 사용하고 있습니까? –

+0

Regex는 무제한의 문자열을 캡처 할 수 없습니다. 공백에 문자열을 나누면 어떨까요? –

답변

3

문자열의 시작 부분부터 특정 패턴 다음에 공백으로 구분 된 인수를 가져와야 할 수도 있습니다. 해당 패턴 다음에 1+ 이상의 문자를 캡처하고 그 값을 얻기 위해 re.search/re.match을 실행하고 일치 항목이 발견되면 split()match.group(1) 만 허용됩니다.

정규식은

^!\w+\s+\w+\s+\w+(.+) 

것으로 판명되거나, 그것을 조금 단축 : ^는 패턴의 시작 부분에 고정되어 re.match에 중복됩니다

^!(?:\w+\s+){3}(.+) 

하는 것으로 디폴트에서는 캐릭터 라인 regex demo을 참조하십시오.

사실
import re 
rx = r"!\w+\s+\w+\s+\w+(.+)" 
s = "!action db_table mandatory_arg arg1 arg2 arg3" 
m = re.match(rx, s) 
if m: 
    print(m.group(1).split()) 
# => ['arg1', 'arg2', 'arg3'] 
+0

좋습니다. 나는 여전히 Regex를 배우고 있으며, 파이썬을 사용하지 않고 모든 것을 단일 검색에서 작동하도록하고 싶습니다. 그러나 나중에 답을 취하겠습니다. – Quake

+0

@Quake PyPi 정규식 모듈을 설치하면 1 정규식으로 모든 작업을 수행 할 수 있습니다. [** this demo **] (http://rextester.com/AAWW31809)를 참조하십시오.내 대답이 최선을 다하는 경우 대답을 수락하는 것이 좋습니다. –

+0

답변을 어떻게 수락합니까? – Quake

1

, 여기에 필요하지 정규식가 없습니다, 단지 split()을 사용합니다 :

이 (가) Python demo 참조

cmds = ['!action db_table mandatory_arg arg1 arg2 arg3...', 
     '!dont match this match1 match2 match3 match4 etc...', 
     'this one not'] 

new_cmds = [args[3:] 
      for cmd in cmds 
      for args in [cmd.split()] 
      if cmd.startswith('!')] 

print(new_cmds) 
# [['arg1', 'arg2', 'arg3...'], 
# ['match1', 'match2', 'match3', 'match4', 'etc...']] 
관련 문제