2013-08-07 4 views
0

저는 정규식을 매우 새로 도입했습니다. 나는 약 3 시간 전에 그것을 집어 들었지만, 나는 걸쇠를 치고, 나는 그것을 흔들 수있는 것처럼 보일 수 없다. 그래서 늘 그렇듯이 모든 문제를 해결하기 위해 인터넷으로 눈을 돌 렸습니다. 그리고 나에게 해답을 설명 할 수 없을 때 stackoverflow를 검색하여 다른 사람이 내 질문에 답변했는지 확인한 다음 마지막 질문을 게시했습니다. 나는 브라우징에서 스스로 대답 할 수 없었다.Python에서 Regex를 사용하여 배열 크기를 얻으십시오.

내가 거의 알아 내지 못했기 때문에 나는 조금 어리석은 짓을 할 것이다. 그러나이 작은 꼬마 한 비트는 내가 원하는대로 작동하지 않는다. 실제로, 그리고 전체 엉망이 복잡하고 설명하기가 어렵지만, 결국, 나는 정규식을 실행하려는 문자열의 전체 무리가 있습니다.

그래서 반복 루프 측면에서 변수 이름이 포함 된 문자열을 전달합니다. 이제 변수가 어떻게 생겼는지 설명하는 데 어려움을 겪고 있습니다. 따라서 예제를 나열하고 파이프를 따라 가면서 추출 할 내용을 살펴 보겠습니다.

Variable | (Variable) 
Variable.list[3]name | (Variable.list[3]name) 
Var.list[5] | (Var.list , 5) 
Var.list_name[3]thing_words[4][3][2] | (Var.list_name[3]thing_words , 4 , 3 , 2) 
Var[3] | (Var , 3) 
Var.word | (Var.word) 

등등. 나는 그것이 명백하게한다라고 생각한다, 그렇지? 대괄호를 포함하거나 포함하지 않는 변수 이름이 필요하며, 대괄호가 있으면 이름에서 제외하고 match.groups()에서 액세스 할 수 있도록 캡처하고 싶습니다. 나는 내부에 숫자가없는 ... []로 끝나는 이름의 변수가 있다고 생각하지 않는다. 그러나있을 수도 있고,있을 수도있다. 나는 그것들을 무시하기를 원한다. 그것은 작동하지 않습니다 ...

for line in list: 
regex = re.compile("^[-\w\[\]\.]+(\[(0-9)*]\])*$") 
match = regex.match(line) 
if match: 
do something that depends on len(match.groups()) 

그러나 :

은 지금은 그런 짓을하려합니다. 정규식은 필자가 생각할 때조차도 결코 일치하지 않는다.

내 마음 속에서 나는 아주 분명합니다! 나는 그것들을 여러개의 물건으로 시작해서 잠재적으로 많은 수의 대괄호로 끝내기를 원한다. 그리고 대괄호로 묶은 숫자로 끝나면 그것을 잡아서 저장한다. 그러나 문자열의 끝 부분에없는 괄호로 묶은 숫자는 무시한다.

그래서 ... 내가 이제 내가 조금씩 중복되는 점에 대해 설명했다. 원하는대로 작동하도록하려면 어떻게해야합니까? 내가 그것을하려는 방식으로도 끝날 수 있습니까?

while (match.endswith("]") 
match.strip("]") 
func() 
match.strip("[") 

FUNC()는 정규식 최종 오프 수를 제거하기 않습니다 : 내가 대신 더 그런 짓을해야 하는가? 그것은 지나치게 복잡하고 매우 혼란스럽게 보입니다. 내 직감 정규 표현식 그것을 처리 할 수있는, 그리고 내 초보자 눈을 그냥 어떻게 볼 수 없다고 말해줍니다.

+0

무엇이 필요합니까? 최선의 해결책은 다른 곳의 변화를 포함 할 수 있습니다. – user2357112

+0

정규 표현식 대신 파서를 사용하는 좋은 사례 인 것처럼 보입니다. 입력 예제는 EBNF 문법에서 멀지 않습니다. –

+0

아, 그게 무슨 뜻인지 말할 수는 없어, 불행히도, 나는 내가 통과되는 것을 바꿀 수 없다. 죄송 해요. 파서 ... 나는 그것에 대해 읽을 것이지만, 당신은 열중 할 수 있습니까? 파이썬에 대해서도 몇 주 밖에 걸리지 않습니다. – CamelopardalisRex

답변

1

이 문제는 re 모듈이 그룹 캡처를 반복 할 수 없기 때문에 실현 한 것보다 약간 복잡하므로 차별화를 위해 수동 작업을해야합니다. 먼저 올바른 정규 표현식을 사용하여 문자열을 올바른 위치로 나눕니다. 다른 번호를 사용하여 모든 번호를 찾으십시오.

def get_variable_and_sizes(var_string): 
    result = re.search(r'(.*?)((?:\[\d*])*)$', var_string) 
    var_name = result.group(1) 
    numbers = re.findall(r'\[(\d+)]', result.group(2)) 
    return [var_name] + numbers 

우리가 여기서하는 일은 두 부분으로 문제를 해결하는 것입니다. 첫 번째 정규 표현식에는 두 개의 캡처 그룹이 있습니다. 첫째는 임의의 수의 문자를 잡아 내고 (두 번째는 괄호로 묶지 않음), 두 번째는 대괄호로 묶은 숫자의 반복을 하나의 단위로 포착합니다 (언급 된대로 그룹 포착을 반복 할 수는 없지만 캡처 그룹 내에서 그룹을 반복 할 수 있음).

우리가 얻은 첫 번째 그룹은 변수 이름입니다. 두 번째 그룹은 그 안에있는 모든 숫자를 식별하기 위해 더 파싱되어야합니다.다행히도 대괄호 안에 숫자를 캡처하는 정규 표현식을 작성한 다음 findall을 사용하면 두 번째 그룹의 모든 일치 목록을 가져올 수 있습니다. 일치하는 항목이 없으면 빈 목록이 표시됩니다.

마지막으로 변수 이름을 포함하는 목록을 만들고 두 번째 정규식에서 얻은 목록을 연결하여 반환합니다.

+0

나는 그것을 지금 시험해 볼 것이다! – CamelopardalisRex

+0

글쎄,이 일을 그만 두지 않는다. var [2] [2] [2]는 (var, 2, 2)가 아니라 (var, 2, 2, 2)를 반환합니다. 올바른 방향! 감사! – CamelopardalisRex

+0

좋아요, 제가 입력 한 내용을 편집하고 테스트했습니다. 작동하는 것 같습니다. – llb

1

가변 개수의 캡처 그룹을 가질 수 있다고 생각하지 않습니다. 그러면 마지막 캡처 그룹의 값만 캡처됩니다. 이 문제를 해결하려면 마지막에 최대 대괄호 수를 알고 있어야합니다. 이 정규식이 문자열의 끝에서 4 개 대괄호 그룹까지 캡처 할

^[a-zA-Z\.]+(?:\[\d\][a-zA-Z\.]+)*(?:\[(\d)\])?(?:\[(\d)\])?(?:\[(\d)\])?(?:\[(\d)\])?$ 

: 그 경우에, 당신은 단순히 당신의 정규식에 배의 수를 코드를 반복 할 수 있습니다.

그 외. 파서가 최선의 선택이라고 생각합니다.

+0

그래? 그래서 제 방법으로는 불가능합니다. 알았어, 내외부가 내 질문에 답해. 고맙습니다. – CamelopardalisRex

+0

예. 확실히. 이 스레드는 비슷한 문제를 해결합니다. http://stackoverflow.com/questions/5018487/regular-expression-with-variable-number-of-groups –

+0

파이썬이 당신을 허용하지 않기 때문에 하나의 정규 표현식으로는 불가능할 수도 있습니다 반복 그룹을 캡처,하지만 그것은 2로 해결할 수 있다고 생각합니다. – llb

관련 문제