2016-06-07 2 views
0

나는이 포함 된 파일이 있습니다올리고 예외, 파이썬

XYZname_1을

XYZname_2

내 스크립트에서 XYZname_3

나는 re.search에 사용하고 이름이 정확하지 않은지 확인하십시오. 나는 raise exception입니다. 두 이름 모두 올바르지 않으면 첫 번째에 예외가 발생하고 "충돌"합니다. 즉 "사용자"는 두 번째 또는 세 번째 이름이 올바르지 않은지 여부를 알 수 없습니다.

for my_file in args.cpath: 
    contents = open(my_file).read() 

    replaced_contents = my_func(contents,my_file) 


def my_func(my_file_contents, filename): 
    for x in range(0, 3): 
     #Some code here which is not related to the problem 

     #In this if-statement I check if it does not match with re.search 
     #I assume a for-loop should be here? but not sure how to implement it. 
     if not re.search(r'(.*)XYZname_{0}\(\)\) = .*;(.*)'.format(x+1), my_file_contents): 
      raise Exception("The name: XYZname_{0} was not found".format(x+1) + " in " + filename) 

말할 수 있습니다 우리가 이전에 (그들이 잘못)

XYZnameHE_1이

XYZnameGJ_2

XYZnameAsd_3

그럼 내 스크립트를 말해야 파일에 다음과 같이 기록 된 본 이름 나에게 주어진 파일에서 XYZname_1,2,3을 찾을 수 없다.

물론 다른 이름도있을 수 있습니다. 다른 기능이 처리합니다. 이러한 이름은 XXXname_1,2 3 등으로 시작할 수 그리고 그들 중 하나가 누락 된 경우 내가 지금뿐만 아니라

을 하나에 대한 예외를 받아야 나는이 출력을 얻을 :

Exception: The name: XYZname_1 was not found in C:\Path 

을하지만, 내가 좋아하는 것

Exception: The name: XYZname_1 was not found in C:\Path 
Exception: The name: XYZname_2 was not found in C:\Path 
Exception: The name: XYZname_3 was not found in C:\Path 
Exception: The name: XXXname_2 was not found in C:\Path 

이 문제를 해결하기위한 "우수 사례"가 무엇인지 알 수 없습니다. 하나의 옵션은 스크립트가 전체 파일을 살펴보고 "충돌"/ 레이즈를 끝내도록하는 것입니다. 아니면 문제가 발견되면 바로 "충돌"/ 제기 하시겠습니까? 왜냐하면 개발자는 모든 잘못된/잘못된 이름을 찾기 위해 스크립트를 여러 번 실행해야하기 때문입니다.

+1

누락 된 이름을 목록에 저장 한 다음 목록에 항목이있는 경우 끝에 올리면 어떨까요? –

답변

1

목록에서 이름/일치 항목을 수집하십시오. 그런 다음 루프가 끝나면 필요한 경우 예외를 발생시킵니다. 내가 이해하는 것보다 search() 대신에 findall()이 필요합니다. 당신은 같은 것이다 끝에

:

matches = [] 
for x in range(0, 3): 
    #Some code here which is not related to the problem 

    # add the matches to the list 
    matches.extend(re.findall(r'(?:.*)(XYZname_{0})\(\)\) = .*;(?:.*)'.format(x+1), my_file_contents)) 

if matches: 
    for match in matches: 
     print("The name: {0} was not found in {1}".format(match, filename)) 
    raise Exception(...) 

은 또한 당신의 표현에 (?:)()를 교체 한 - 비 캡처와 그룹을 캡처 교체했다. 또한 () 주위에 XYZname_{0}을 캡처하여 이름을 캡처하십시오.

for x in range(): 
    try: 
     re.search ... 
    except: 
     raise exception ... 

아니 파이썬 전문가가 아니라 순수 코드/논리의 관점에서 트릭을 수행해야한다 :

+0

흠 나는 이것을 시험해 보았지만 이름이 잘못되어도 내 시험은 녹색으로 진행됩니다. – gants

+0

@gants는 표현식에 문제가 될 수 있습니다.나는 당신이're.DOTALL'과're.MULTILINE' 플래그를 사용할 필요가 있다고 생각합니다. 그리고 패턴의 처음과 끝 부분에'(? :. *)'부분을 피할 수 있습니다. – alecxe

+0

좋아요? format (x + 1), my_file_contents) 'matches.extend (re.findall (r'(? :. *) (XYZname_ {0}) \ (\) \) =. *; (? :. *) , re.MULTILINE, re.DOTALL)'예기치 않은 arugment 인 것 같아요 '라고 덧붙이면 – gants

0

을 사용하면 단일 패스 대신 반복의 각 항목에/캐치를 시도합니다.