티스토리 뷰

728x90

aa001,aa002,aa003,ddd,aa004,bb001,bb002,bb003,aaa,ccc,bb005

 

만약 csv 파일이나 엑셀에 위와 같은 문자열들이 있을 때 숫자와 문자열을 분리를 하고

또 연속된 숫자들이면 (aa001~aa004)시작~끝까지 이런식으로 변경을 하고 싶을 때

숫자가 있는 문자열도 있고 없는 문자열들도 있다. 

 

파이썬으로 노가다를 해서 분리를 시켜 보았다.

핵심 코드는 my_mod.py 소스 이지만 제네릭 하지 않고 막코딩한 느낌의 코드이지만 공개 한다.

 

파이썬3 소스

main.py

from my_mod import str_conv, my_regex

aa = 'aa001,aa002,aa003,ddd,aa004,bb001,bb002,bb003,aaa,ccc,bb005'

print(aa)
dict1, list1 = my_regex(aa)
get_list = str_conv(dict1)
comb_list = get_list + list1

print(','.join(comb_list))

 

my_mod.py

더보기
import re

def my_regex(aa):
    list1 = []
    dict1 = {}
    inner_list = [elt.strip() for elt in aa.split(',')]

    regex = re.compile(r'[a-z][a-z]\d\d\d')
    for cc in inner_list:
        if re.search('[a-z]+\d\d\d', cc):
            k = re.search('[a-z]+', cc)[0]
            v = int(re.search('\d+', cc)[0])
            # print(k, v)
            if k in dict1:
                dict1[k].append(v)
            else:
                dict1[k] = [v]
        else:
            list1.append(cc)
    return dict1, list1


def get_list(queue):
    packet = []
    tmp = []
    v = queue.pop(0)
    tmp.append(v)
    while(len(queue)>0):
        vv = queue.pop(0)
        if v+1 == vv:
            tmp.append(vv)
            v = vv
        else:
            packet.append(tmp)
            tmp = []
            tmp.append(vv)
            v = vv
    packet.append(tmp)
    ret_list = []
    ret_dict = {}
    for i in packet:
        ret_dict['start'] = i[0]
        ret_dict['end'] = i[len(i)-1]
        ret_list.append(ret_dict.copy())
    return ret_list


def str_conv(dict1):
    result = []
    for k, v in dict1.items():
        vlist = get_list(v)
        # print(vlist)
        for vv in vlist:
            start = ''
            end = ''
            start = str(vv['start'])
            end = str(vv['end'])
            if 1 == len(start):
                start = '00' + start
            elif 2 == len(start):
                start = '0' + start
            else:
                pass
            if 1 == len(end):
                end = '00' + end
            elif 2 == len(end):
                end = '0' + end
            else:
                pass

            if start != end:
                result.append("{}{}~{}".format(k, start, end))
            else:
                result.append("{}{}".format(k, start))
            # print(result)
    return result
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함