Jetson 카메라 드라이버 펌웨어(BSP) 수정을 통해 I2C가 없을때 MIPI 영상 받아오기를 목표

 

 

1. BSP 다운로드 사이트

https://developer.nvidia.com/embedded/downloads

 

Jetson Download Center

No downloads meet your criteria.

developer.nvidia.com

 

 

  • Jetson L4T 패키지로 이동

Jetson Linux Driver Package (L4T)  

 

 

  • 소스 - 드라이버 패키지(BSP) 소스 다운로드

 

 

1. opencv 다운로드

- release 배포판

https://github.com/opencv/opencv/releases/tag/3.4.9

 

Release OpenCV 3.4.9 · opencv/opencv

OpenCV 3.4.9 has been released.

github.com

 

- opencv contrib release 배포판

https://github.com/opencv/opencv_contrib/releases

 

Releases · opencv/opencv_contrib

Repository for OpenCV's extra modules. Contribute to opencv/opencv_contrib development by creating an account on GitHub.

github.com

 

 

 

- 압축 해제 시 위치를 바로 선택하는게 좋음

 

2. Cmake 설치

https://cmake.org/download/

 

Download CMake

You can either download binaries or source code archives for the latest stable or previous release or access the current development (aka nightly) distribution through Git. This software may not be exported in violation of any U.S. export laws or regulatio

cmake.org

 

 

 

- 설치 시 PATH 자동 생성 설정

 

 

3. Cmake 설정

- opencv의 sources와 build의 경로를 가각 설정

 

 

- Generate 를 MinGW로 변경 

 

-설치가 진행되며 5~7분 정도 걸린다.

 

 

- 추가하면 좋은 것들

 

 

4. opencv build

- cmd 에서 opencv의 build 폴더로 이동 후 mingw32-make 명령 실행 빌드 하는데 시간이 소요됩니다

cd C:/opencv/build

mingw32-make

 

mingw32-make install

 

 

참고자료

https://mickael-k.tistory.com/39

1. 성능과 속도

영상처리 프로그램, 특히 CCTV와 같은 실시간 영상처리 시스템에서는 높은 성능과 빠른 처리 속도가 필수적입니다. Python은 배우기 쉽고 코드 작성이 간편하여 많은 개발자들이 선호하지만, 인터프리터 언어로서 성능 면에서 제약이 있습니다. C++은 컴파일러 언어로서 하드웨어 자원을 효율적으로 활용할 수 있어, 영상 데이터 처리와 같은 고성능 작업에서 뛰어난 성능을 발휘합니다.

  • Python의 성능 제약: Python은 인터프리터 언어로 실행 시마다 코드가 해석되어 실행되기 때문에, 반복적인 연산이나 대용량 데이터 처리가 필요한 영상처리 작업에서는 속도가 느려질 수 있습니다.
  • C++의 성능 장점: C++은 컴파일 언어로, 코드가 미리 컴파일되어 기계어로 변환되므로 실행 속도가 매우 빠릅니다. 따라서 실시간 영상처리와 같은 고속 처리가 요구되는 작업에 적합합니다.

2. 메모리 관리

영상처리 작업은 대량의 영상 데이터를 다루기 때문에 메모리 관리가 중요합니다. Python은 자동 메모리 관리(Garbage Collection)를 제공하지만, 이는 때때로 예기치 않은 메모리 사용량 증가나 성능 저하를 야기할 수 있습니다. C++은 개발자가 직접 메모리를 관리할 수 있어, 더 효율적이고 최적화된 메모리 사용이 가능합니다.

  • Python의 메모리 관리: Python의 자동 메모리 관리는 사용이 편리하지만, 복잡한 영상처리 알고리즘에서는 메모리 누수가 발생하거나 성능 저하가 일어날 수 있습니다.
  • C++의 메모리 관리: C++은 포인터를 사용하여 직접 메모리를 할당하고 해제할 수 있어, 메모리 사용을 최적화할 수 있습니다. 이는 대규모 영상 데이터를 다루는 CCTV 시스템에서 중요한 이점입니다.

3. 하드웨어 접근성

영상처리 작업에서는 GPU와 같은 고성능 하드웨어 자원을 활용하는 것이 중요합니다. C++은 하드웨어와의 밀접한 연동이 가능하며, CUDA와 같은 GPU 프로그래밍 라이브러리를 직접 사용할 수 있습니다. 반면, Python은 이러한 하드웨어 자원에 대한 접근성이 제한적이며, 주로 C++로 작성된 라이브러리를 바인딩하여 사용합니다.

  • Python의 제한된 하드웨어 접근성: Python에서는 GPU를 활용하기 위해 주로 C++로 작성된 라이브러리(CUDA, OpenCV 등)를 사용합니다. 이는 성능 저하와 호환성 문제를 야기할 수 있습니다.
  • C++의 하드웨어 접근성: C++은 CUDA와 같은 GPU 프로그래밍 도구를 직접 사용하여 고성능 병렬 처리를 구현할 수 있습니다. 이는 실시간 영상처리와 같은 고속 연산이 필요한 작업에서 큰 장점입니다.

4. 라이브러리와 생태계

Python은 풍부한 라이브러리 생태계를 자랑하지만, 많은 경우 C++로 작성된 라이브러리를 바인딩하여 사용합니다. 이는 Python의 편리함을 유지하면서도 C++의 성능을 활용할 수 있는 방법이지만, 직접 C++를 사용하는 것이 더 나은 성능과 유연성을 제공할 수 있습니다.

  • Python 라이브러리의 한계: Python의 영상처리 라이브러리(OpenCV, NumPy 등)는 대부분 C++로 작성된 코드를 바인딩한 것입니다. 이는 성능 면에서 이점이 있지만, 고급 사용자가 세밀한 최적화를 할 때는 한계가 있을 수 있습니다.
  • C++ 라이브러리의 강점: C++은 OpenCV, Boost 등 고성능 라이브러리를 제공하며, 이는 영상처리 작업에서 탁월한 성능을 발휘합니다. C++로 직접 개발함으로써 더 높은 유연성과 성능 최적화를 달성할 수 있습니다.

5. 결론

영상처리 프로그램, 특히 실시간 CCTV 시스템과 같은 고성능 요구사항이 있는 경우, Python만으로는 한계가 있을 수 있습니다. 성능, 메모리 관리, 하드웨어 접근성, 라이브러리 활용 측면에서 C++을 함께 사용하는 것이 더 나은 결과를 제공합니다. Python의 편리함과 C++의 성능을 적절히 결합하여 최적의 영상처리 솔루션을 구현하는 것이 바람직합니다.

'C++ > Basic' 카테고리의 다른 글

[C++] windows vscode opencv 설치  (0) 2024.06.06
[C++] VS code C++ 환경 세팅  (0) 2024.06.06

VS code 환경 세팅

1. C++ 컴파일러 설치

2. VScode Compiler configure

3. C++ Run test

 

 

1. C++ 컴파일러 MinGW 설치

 

설치 링크 : https://www.mingw-w64.org/downloads/#llvm-mingw

 

Downloads - MinGW-w64

Downloads The heart of the Mingw-w64 project is headers and support libraries to run the output of GCC on Windows. Since Mingw-w64 is neither the home of GCC nor of binutils, several sets of installation packages which combine them are available. In additi

www.mingw-w64.org

 

 

- 사이트 이동 후 바로 'SourceForge' 클릭

 

 

- SourceForge 이동 후 아래로 스크롤해서 다음 이미지로 화면으로 이동 후 MinGW-W64 GCC - (version) 에서 첫번째 파일 다운로드

 

 

2. 컴파일러 파일 압축해제

압축 해제 프로그램 링크 : https://www.7-zip.org/

 

7-Zip

7-Zip 7-Zip is a file archiver with a high compression ratio. Download 7-Zip 24.06 (2024-05-26) for Windows x64 (64-bit): Link Type Windows Size Download .exe 64-bit x64 1.6 MB Download 7-Zip 24.06 for another Windows platforms (32-bit x86 or ARM64): Link

www.7-zip.org

 

- 프로그램 설치 후 압축해제

 

 

3. 환경 변수 설정

 

- 환경 변수 -> path 에서 파일 경로 추가

** mingw64\bin 으로 추가하기

 

 

4. 설치 확인

- 프롬프트에서 다음의 명령어로 확인

gcc --version
g++ --version
gdb --version

 

 

5. VS code C/C++ extensions 설치

 

- 이후 Configure Default Build Task 선택

 

 

- C++은 g++ , C언어는 gcc 설정

 

 

6. 컴파일러 실행

- test.cpp 생성 후 예시 코드 작성

#include <iostream>

int main() {
    std::cout << "Hello World!" << std::endl;
    return 0;
}

 

- Ctrl + Shift + B 눌러 빌드 하여 .exe 파일 생성

 

성공 시 아래의 터미널 출력이 나온다

 

 

- Ctrl + Shift + P 누른 후 C/C++: Run C/C++ file 선택

 

 

- Run 아이콘이 생기며

 

정상적으로 Hello World! 가 표시된것을 확인할 수 있다.

 

 

 

더보기

C++ 컴파일러 설치 -> VScode Compiler configure -> C++ Run test 완료!

 

+++ 단축키 추가 +++

VScode 좌상단 삼단바에서 ' 파일 -> 기본 설정 -> 바로 가기 키' 에서 우상단에서 아래 아이콘을 클릭 하면 keybindings.json 파일이 열림

keybindings.json에 아래 내용 입력

[
    // 컴파일 단축키
    {
        "key": "ctrl+alt+c",
        "command": "workbench.action.tasks.build"
    },
    // 실행 단축키
    {
        "key": "ctrl+alt+r",
        "command": "workbench.action.tasks.test"
    }
]

 

 

참고자료

1.

https://velog.io/@mimimya/Visual-Studio-Code%EC%97%90-CC-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0

 

Visual Studio Code에 C/C++ 세팅하기

서론 지난 글에서 개발환경 구축을 위해 VSCode를 설치하고 간단하게 살펴 보았다. 이번 글에서는 Visual Studio Code에서 C언어와 C++언어를 세팅하는 과정을 알아본다.

velog.io

2. 

https://3dlecture.tistory.com/9

 

【C/C++환경설정】Visual Studio Code에서 C/C++ 코딩 환경 구축하기[Configure Visual Studio Code for C/C++]

Visual Studio Code 다운로드 및 설치 단계 1 : Google에서 "Visual Studio Code"을 검색하여, 공식사이트에서 정식판을 다운로드한다. 마이크로소프트에서 개발한 텍스트 에디터로, 2015년 4월 29일에 소개되고

3dlecture.tistory.com

 

인공지능 학습에서 데이터 label의 균형 분포와 shuffle은 과적합과 데이터 불균형 문제의 효과적인 예방법이다

 

 

 

1. K 폴드 교차 검증

 

K 폴드 교차 검증으로 전체 데이터를 나누는 방법으로 사용된다

import numpy as np
from sklearn.model_selection import KFold
arr = np.arange(20)

folds = KFold(n_splits=5, shuffle=True)
for train_idx, vaild_idx in folds.split(arr):
  print( f'훈련용 { arr[train_idx] }, 검증용 { arr[vaild_idx] }' )

n_splits 는 데이터 세트 개수, shuffle은 데이터를 섞을지의 여부로 0 ~ 19의 데이터를 훈련용과 검증용을 구분하여

val를 K폴드 교차 검증 방법으로 나누는 코드이다

훈련용 [ 0  2  3  4  5  6  7 10 11 12 13 14 16 17 18 19], 검증용 [ 1  8  9 15]
훈련용 [ 1  2  4  5  7  8  9 10 11 12 14 15 16 17 18 19], 검증용 [ 0  3  6 13]
훈련용 [ 0  1  3  4  5  6  7  8  9 10 13 14 15 16 17 18], 검증용 [ 2 11 12 19]
훈련용 [ 0  1  2  3  6  7  8  9 11 12 13 15 16 17 18 19], 검증용 [ 4  5 10 14]
훈련용 [ 0  1  2  3  4  5  6  8  9 10 11 12 13 14 15 19], 검증용 [ 7 16 17 18]

 

 

 

 

2. 층화 K 폴드 교차 검증

 

데이터 label이 불균형하게 분포되어있을때 균형있는 분포를 위해 사용된다

from sklearn.model_selection import StratifiedKFold
y = np.array(['A']*5 + ['B']*45)
X = np.arange( len(y) )
folds = StratifiedKFold(n_splits=5)
for idx, (train_idx, vaild_idx) in enumerate( folds.split(X, y) ):
  print( f'검증용 {idx + 1} 번째 데이터')
  print( f'검증용 { y[vaild_idx] }' )

45:5 비율의 데이터를 K폴드로 나누면 A데이터가 없는 데이터세트가 생길 수 있기에 층화 K폴드를 사용하면 된다

 

검증용 1 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']
검증용 2 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']
검증용 3 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']
검증용 4 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']
검증용 5 번째 데이터
검증용 ['A' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B' 'B']

 

 

 

 

3. GridSearchCV

교차검증과 하이퍼파라미터 튜닝

from sklearn.model_selection import GridSearchCV, RandomizedSearchCV, train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=45)
X_train.shape, X_test.shape, y_train.shape, y_test.shape

gridModel = GridSearchCV(
    model,
    {
        'max_depth':[1,2,3],
        'min_samples_split':[2,3]
    },
    cv = 5,
    refit = True,
    return_train_score=True

교차검증과 함께 하이퍼파라미터 튜닝도 같이 진행하게 된다 위 예시 코드로는 max_depth에 1,2,3, min_samples_split 2,3  의 값중 가장 정확도가 높은 파라미터를 얻을 수 있게된다.

 

해당 방법은 대규모 학습에서는 미니멀하게 학습을 진행하여 실험적으로 진행한다

 

 

 

 

4. RandomizedSearchCV

random_cv = RandomizedSearchCV(
    DecisionTreeClassifier(), 
    {
        'max_depth':randint(low=3, high=11),
        'max_features':randint(low=2, high=4),
    },
    n_iter=24,
    random_state=1,
    scoring='accuracy',
    verbose=1
)

 

n_iter 탐색횟수만큼 랜덤하게 학습을 진행한다

검증용이 테스트용보다 정확도가 높은 경우가 자주 발생하여 과적합이 자주 발생하는 방법이다

머신러닝 피쳐스케일링의 4가지 방식

 

 

 

1. MinMax Scaler

from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(arr)

최소값이 0, 최대값이 1이 되도록 조정한다

이상수치가 있을 시 좁은 구간에 데이터가 몰릴 수 있음 제거필요

 

 

 

2. Standard Scaler

from sklearn.preprocessing import StandardScaler
StandardScaler().fit_transform(arr2)

평균 0, 표준편차 1이 되도록 모든 값을 조정하여 정규분포를 따르게한다

 

 

 

3.MaxAbs Scaler

from sklearn.preprocessing import MaxAbsScaler
MaxAbsScaler().fit_transform(arr3)

0을 기준으로 절대값이 최대인값을 1로 설정하고 나머지 값들은 기준에 맞추어 0~1 사이로 변환 처리

 

 

4. Robust Scaler

from sklearn.preprocessing import RobustScaler
RobustScaler().fit_transform(arr4)

중앙값을 0, 사분위수 기준 전체 데이터의 50%가 중앙에 밀집되도록 변환

중앙에 흩어진 범위가 1이 되도록 조정한다

 

 

 

jupyter notebook or colab 환경에서 사용할수있는 동적 시각화 패키지(?) 사용

 

인터랙션 시각화 1편은 plotly를 사용한 인터랙션 시각화로 구성되어있습니다

 

 

1. 선형회귀 + 산포도

import plotly.express as px

df = px.data.tips()
fig = px.scatter(df, x="total_bill", y="tip", trendline="ols")
fig.show()

express를 사용한 데이터, 결제금과 팁 간의 선형회귀 + 산점도(산포도)

기본적이지만 데이터의 구조를 파악하는데 도움이 많이 되는 시각화 방법입니다

 

 

 

2. gapminder data 분포도

import plotly.express as px

df = px.data.gapminder().query("year == 2007").query("continent == 'Europe'")
df.loc[df['pop'] < 2.e6, 'country'] = 'Other countries' # Represent only large countries
fig = px.pie(df, values='pop', names='country', title='Population of European continent')
fig.show()

유럽 인구 분포도

 

 

 

 

3. pie 분포

import plotly.express as px

df = px.data.tips()
fig = px.pie(df, values='tip', names='day', color_discrete_sequence=px.colors.sequential.RdBu)
fig.show()

 

 

 

 

 

4. go pie 분포 pull

import plotly.graph_objects as go

labels = ['a','b','c','d']
values = [4500, 2500, 1053, 500]

fig = go.Figure(data=[go.Pie(labels=labels, values=values, pull=[0, 0, 0.2, 0])])
fig.show()

 

 

 

 

 

5. distplot

import plotly.figure_factory as ff
import numpy as np

# Add histogram data
x1 = np.random.randn(200) - 2
x2 = np.random.randn(200)
x3 = np.random.randn(200) + 2
x4 = np.random.randn(200) + 4

# Group data together
hist_data = [x1, x2, x3, x4]

group_labels = ['Group 1', 'Group 2', 'Group 3', 'Group 4']

# Create distplot with custom bin_size
fig = ff.create_distplot(hist_data, group_labels, bin_size=.2)
fig.show()

 

 

 

6. Box plot

import plotly.express as px

df = px.data.tips()

fig = px.box(df, x="day", y="total_bill", color="smoker")
fig.show()

개인적으로 박스 플롯이 데이터 분석에 도움이 많이 되는 시각화 그래프라고 생각해요 예외 데이터 확인과 핵심데이터 구간 확인이 동시에 되는 효율적인 시각화 입니다 *_*

 

 

 

 

 

7.  histgram

import plotly.express as px
df = px.data.tips()

fig = px.density_heatmap(df, x="total_bill", y="tip", marginal_x="histogram", marginal_y="histogram")
fig.show()

데이터를 처음 분석할 때 기본적인으로 확인해보는 정보들을 자동화하여 인사이트 도출에 도움이되는 pandas-profiling

 

데이터의 기본 정보들을 파악하기 위해 사용하며 세부적인 분석은 직접 구성하는것이 좋다

 

 

colab 환경에서 진행

 

 

 

1. pandas-profiling install

!pip install -U pandas-profiling

 

 

 

2. Data load

import pandas as pd

# eng data file
df = pd.read_csv('/content/drive/MyDrive/data.csv, 
                 encoding='latin1')

 

 

3. create report

report = df.profile_report()
report

 

 

4. save HTML

report.to_file('data_EDA_report.html')

 

VScode 에서 anaconda python 환경을 만든 후 ipynb 개발을 위해서 환경 세팅하는 방법입니다

 

일반적인 anaconda 환경을 만든 후 ipykernel을 install하면 되지만 중간에 HTTPS 에러가 생겨서 그에 따른 해결방법입니다.

 

 

 

anaconda prompt

conda create -n <환경명> python=<버전명>

 

 

conda list

conda env list

 

 

conda activate

conda activate <환경명>

 

 

install ipykernel

pip install ipykernel

 

 

HTTPS error

CondaSSLError: OpenSSL appears to be unavailable on this machine. OpenSSL is required to download and install packages.

Exception: HTTPSConnectionPool(host='repo.anaconda.com', port=443): Max retries exceeded with url: /pkgs/main/win-64/current_repodata.json (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available."))

 

 

conda path

where python

 

 

Error solution

anaconda>3>Library>bin 에서
- libcrypto-1_1-x64.dll
- libssl-1_1-x64.dll

anaconda3>DLLs에 추가

 

에러가 해결되지 않으면 재시작 후 실행

저는 재시작 까지 완료 후 해결되었습니다

 

 

 

 

참고자료

https://velog.io/@hamster/window%EC%97%90%EC%84%9C-anaconda3-%EC%97%90%EC%84%9C-conda-install-%EC%8B%9C-HTTPSConnectionPool-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0

데이터 분석 텍스트 마이닝 정규표현식 2편 함수

  1. match()
  • 문자열 처음부터 정규식의 매칭 조사
p = re.compile('[0-9]+') res = p.match('abcd1415')

 

시작부터 정규식에 매칭되지 않았기에 None

2. search()

  • 문자열의 전체와 정규식의 매칭 조사
  • res = p.search( 'abcd5 5skdn 1234 sdfjw434' ) 
    print(res)
 

5

3. findall()

  • 정규식에 매칭되는 모든 문자열을 list로 리턴
p = re.compile('[a-z]+') 
res = p.findall( 'abcd5 5obnd 1234 sdfjw434 12abc34 ad12fh' ) 
if res: print( res )

문자열에서 소문자로만 이어진 문자열을 다 찾아서 리스트로 리턴한다

['abcd', 'obnd', 'sdfjw', 'abc', 'ad', 'fh']

4. finditer()

  • 정규식에 매칭되는 모든 문자열을 iterator 리턴
 
res = p.finditer( 'abcd5 5obnd 1234 sdfjw434 12abc34 ad12fh' ) 
for w in res: 
	print( w, w.group(), w.start(), w.end(), w.span() )

검색된 부분이 문자열내에 어떤 위치에 있는지도 리턴한다

ex) <re.Match object; spang=(0,4), match='abcd'> abcd 0 4 (0, 4)

5. sub()

  • 정규식에 매칭되는 부분을 특정 문자열로 대체
 
p = re.compile('(red|blue|white)') 
p.sub('컬러', '내가 좋아하는 색은 red, 너가 좋아하는건 blue, white는 모두가')

정규식에 매칭되는 부분을 컬러 문자열로 대체한다

'내가 좋아하는 색은 컬러, 너가 좋아하는건 컬러, 컬러는 모두가'

6. group()

  • 데이터를 그룹화하여 추출 가능
 
text = 'SKT 010-1234-5678 홍길동' 
p = re.compile(r'(\w+)\s+((\d+)[-](\d+)[-](\d+))\s+(\w+)') 
m = p.search(text) 
for n in m.groups(): 
	print( n )

SKT

010-1234-5678

010

1234

5678

홍길동

7. compile()

7-1 DOTALL, S

p = re.compile( 'a.b', re.DOTALL ) 
print( p.match('a|b') ) 
print( p.match('a\nb') )

첫번째는 원래 출력되는 코드이며 두번째는 DOTALL이 없을때는 줄바꿈으로 None이 출력되지만 DOTALL을 통해 줄바꿈도 처리된다

re.DOTALL 은 re.S로 작성해도 된다

7-2 IGNOGRECASE, I

  • 대소문자 구분없이 매칭
 
p = re.compile( '[a-z]', re.I ) 
print( p.match('python').group() ) 
print( p.match('Python').group() )

p, P 가 출력되며 대소문자 구분없이 매칭된다

7-3 MULTILINE, M

  • 여러 문장을 탐색하면서 매칭

7-4 VERBOSE, X

  • 복잡한 정규식을 설명할때 사용
 

 

p = re.compile( r''' ( # 그룹핑 시작 
0[0-7]+ # 8진수 | 
[0-9]+ # 10진수 | 
x[0-9a-fA-F]+ # 16진수 
) # 그룹핑 끝 ; # 문자1개 ''', re.X)

8. 전방탐색

text = 'https://m.naver.com' 
p = re.compile('.+:') 
m = p.search( text ) 
if m: 
	print( m.group() )

https: 예시처럼 url을 취득할때 사용할 수 있다

8-1. 긍정형 전방탐색

text = 'https://m.naver.com' 
p = re.compile('.+:') 
m = p.search( text ) 
if m: 
	print( m.group() )

긍정형 전방탐색으로 예시와 같이 정규식에 해당하는 값을 받아올때 사용한다

8-2 부정형 전방탐색

p = re.compile('.*[.](?!py$|msi$).*$')

 

위 코드는 부정형 전방탐색의 예시로 파일들 중에서 확장자가 py, msi로 끝나는 파일을 제외한다 처럼 파일 확장자 제외와 같은 상황에 사용한다

9. 주민번호 필터링

p = re.compile( '(\d{6})[-]\d{7,7}' ) 
data = ''' A 741007-1234567 B 020115-3234567 ''' 

print( p.sub( '\g<1>-*******', data) ) 
---- 
p = re.compile( '(\d{6})[-](\d)\d{6}' ) 

print( p.sub( '\g<1>-\g<2>******', data) )

첫번째 print는 뒷자리 모두 *표시로 처리하는 코드이고

두번째 print는 뒷자리 첫번째숫자만 표시되도록 만든 코드이다

data라는 텍스트에 컴파일 형식에 따라 출력하는 방식을 설정하는 방식이다

+ Recent posts