>

파이썬 (일반적으로 프로그래밍)을 처음 접했고 누군가 나를 도와 줄 수 있기를 바라고 있습니다. 현재 수동으로 수행하고 있지만 더 이상 실행할 수없는 작업을 자동화하려고합니다. 주어진 두 문자열 사이의 모든 문자열을 찾아서 쓰고 싶습니다. 예를 들어, 시작 및 종료 문자열이 XYZ-DF 000010 인 경우  그리고 XYZ-DF 000014 원하는 출력은 XYZ-DF 000010 여야합니다. ;와이즈 비즈 ;와이즈 비즈 ;와이즈 비즈 ;와이즈 비즈 . 접두사와 숫자 (및 패딩)가 항상 같은 것은 아닙니다. 예를 들어, 목록에서 다음 시작 및 끝 문자열은 XYZ-DF 000011 일 수 있습니다.  그리고 XYZ-DF 000012 . 그러나 시작 및 끝 문자열 쌍의 접두사와 패딩은 항상 동일합니다.

접두사 (알파벳, 공백, 밑줄, 하이픈 등 포함)와 숫자를 분리하고 숫자에서 패딩을 제거하고 모든 시작 및 끝 문자열에 대해 숫자를 시작 숫자에서 끝 숫자로 1 씩 증가시켜야한다고 생각합니다 두 번째 루프에서 마지막으로 연결하여 출력을 가져옵니다.

지금까지 내가 가진 것 :

먼저 csv의 시작 및 끝 문자열 목록이 포함 된 2 개의 열을 팬더를 사용하여 목록으로 읽습니다.

XYZ-DF 000013

다음으로 zip 함수를 사용하여 "begs"와 "ends"를 반복합니다.

XYZ-DF 000014

루프 안에서, 각 문자열을 구 걸고 끝내고 (한 번에 한 쌍씩) 반복하고 싶습니다.

1) 정규식을 사용하여 문자 (알파벳, 공백, 밑줄, 하이픈 등)를 각 문자열의 숫자 (패딩 포함)와 한 번에 하나씩 분리하십시오.

ABC_XY00000001

2)이 작업 후에 start_num_stripped에서 end_num_stripped까지 중첩 된 while 루프를 실행하십시오

ABC_XY00000123

마지막으로, 시작 및 끝 문자열의 각 쌍에 대한 output_string을 시작 문자열, 종료 문자열 및 출력 문자열을 포함하는 3 개의 열이 포함 된 csv 파일에 작성하는 방법은 무엇입니까? csv 형식의 출력 예는 다음과 같습니다 (각 행 다음에 줄 바꿈이 명확하고 출력에 필요하지 않음).

"시작 문자열", "종료 문자열", "출력 문자열"

"ABCD-00001", "ABCD-00003", "ABCD-00001;ABCD-00002;ABCD-00003"

"XYZ-DF 000010", "XYZ-DF 000012", "XYZ-DF 000010;XYZ-DF 000011;XYZ-DF 000012"

"BBB_CC0000008", "BBB_CC0000014", "BBB_CC0000008;BBB_CC0000009;BBB_CC0000009;BBB_CC0000010;BBB_CC0000011;BBB_CC0000012;BBB_CC0000013;BBB_CC0000014"

columns = ['Beg', 'End'] data = pd.read_csv('C:/Downloads/test.csv', names=columns, header = None) begs = data.Beg.tolist() ends= data.End.tolist()

  • 답변 # 1

    정규 표현식을 사용하여 가장 긴 후행 숫자 접미사를 찾을 수 있습니다. 그런 다음 처음부터 끝까지 숫자를 반복하여 공통 접두사에 선행 0을 추가합니다.

    import re
    startString = "XYZ-DF 000010"
    endString   = "XYZ-DF 000012"
    suffixLen   = len(re.findall("[0-9]*$",startString)[0])
    start       = int("1"+startString[-suffixLen:])
    end         = int("1"+endString[-suffixLen:])
    result      = [ startString[:-suffixLen]+str(n)[1:] for n in range(start,end+1) ]
    csvLine     = '"' + '","'.join([ startString,endString,";".join(result) ]) + '"'
    print(csvLine) # "XYZ-DF 000010","XYZ-DF 000012","XYZ-DF 000010;XYZ-DF 000011;XYZ-DF 000012"
    
    

    참고 : int ( "1"+ suffix)를 사용하면 범위의 숫자가 항상 접미사 길이 (1xxxxx)보다 1 자리가 더 많아집니다. 이렇게하면 첫 문자를 다시 문자열로 바꾸어 놓기 만하면 쉽게 선행 0을 얻을 수 있습니다. str(n)[1:]  

    Note2 : 팬더에 익숙하지 않지만 result 에서 직접 CSV를 작성할 수있는 방법이 있다고 확신합니다  내가 csvLine 에서했던 것처럼 수동으로 형식을 지정하는 대신 목록

관련 자료

  • 이전 java - JUnit에서 setUp ()이 호출되지 않습니다
  • 다음 디렉토리와 다른 모듈 이름을 가진 프로젝트를 android studio로 가져 오기