'Programming/Python'에 해당되는 글 79건

  1. 2016.10.09 [REGEX] Substitude
  2. 2016.10.08 [REGEX] 전방 탐색 (Lookahead Assertions), 후방 탐색
  3. 2016.10.08 [REGEX] 그룹 재활용
  4. 2014.09.15 Python Function : any(), all()
  5. 2013.05.31 이진 트리
  6. 2013.05.17 bisect Module
  7. 2013.05.17 multiprocessing Module
  8. 2013.05.13 Regular Expression

[REGEX] Substitude

Programming/Python 2016. 10. 9. 22:24 |

sub 메서드를 이용하면 정규식과 매치되는 부분을 다른 문자로 쉽게 바꿀 수 있다.


sub 메서드의 첫 번째 입력 인수는 "바꿀 문자열"이 되고, 두 번째 입력 인수는 "대상 문자열"이 된다. 

바꾸기 횟수를 제어하려면 다음과 같은 세 번째 입력 인수로 count값을 넘기면 된다.

comp.sub('colour', 'blue socks and red shoes', count=1)


subn 역시 sub와 동일한 기능을 하지만 리턴되는 결과를 튜플로 리턴한다는 차이가 있다. 리턴된 튜플의 첫 번째 요소는 변경된 문자열이고, 두 번째 요소는 바꾸기가 발생한 횟수이다.




sub 메서드 사용 시 참조 구문 사용하기

위 예는 "이름 + 전화번호"의 문자열을 "전화번호 + 이름" 으로 바꾸는 예이다. sub의 바꿀 문자열 부분에 "\g<그룹명> 을 이용하면 정규식의 그룹명을 참조 할 수 있다.

그룹명 대신 참조 번호를 이용해도 마찬가지의 결과가 리턴된다.




sub 메서드의 입력 인수로 함수 넣기

sub 메서드의 첫 번째 입력 인수로 함수를 넣을 수도 있다. 

Dec2Hex 함수는 match 객체(위에서 숫자에 마치되는)를 입력으로 받아 16진수로 변환하여 리턴하는 함수이다. sub의 첫 번째 입력 인수로 함수를 사용할 경우, 해당 함수의 첫 번째 입력 인수에는 정규식과 매치된 match 객체가 입력된다. 그리고 매치되는 문자열은 함수의 리턴 값으로 바뀌게 된다.




Example

전화번호의 마지막 숫자 4개를 #으로 변경하는 예제


'Programming > Python' 카테고리의 다른 글

[REGEX] 전방 탐색 (Lookahead Assertions), 후방 탐색  (0) 2016.10.08
[REGEX] 그룹 재활용  (0) 2016.10.08
Python Function : any(), all()  (0) 2014.09.15
이진 트리  (0) 2013.05.31
bisect Module  (0) 2013.05.17
Posted by scii
:

정규식 .+: 과 일치하는 문자열로 http: 가 리턴되었다. 만약 http:라는 검색 결과에서 : 을 제외하고 출력하려면 어떻게 해야할까?

위 예는 그나마 간단하지만 훨씩 복잡한 정규식이어서 그룹핑은 추가로 할 수 없다는 조건까지 더해진다면 어떻게 해야 할까?

이럴 때 사용할 수 있는 것이 바로 전방 탐색이다.


전방 탐색에는 긍정(Positive)과 부정(Negative)의 2종류가 있다.

(?=...)   긍정형 전방 탐색   -   ...에 해당되는 정규식과 매치되어야 하며, 조건이 통과되어도 문자열이 소모되지 않는다.

(?!...)   부정형 전방 탐색   -   ...에 해당되는 정규식과 매치되지 않아야 하며, 조건이 통과되어도 문자열이 소모되지 않는다.


긍정형 전방 탐색

정규식 중 :에 해당하는 부분에 긍정형 전방 탐색 기법이 적용되어 (?=:)으로 변경되었다. 이렇게 되면 기존 정규식과 검색에서는 동일한 효과를 발휘하지만 :에 대당되는 문자열이 정규식 엔진에 의해 소모되지 않아(검색에는 포함되지만 검색 결과에는 제외됨) 검색 결과에서는 :이 제거된 후 리턴되는 효과가 있다.



.*[.].*$

이 정규식은 파일명 + . + 확장자를 나타내는 정규식이다. 이 정규식은 foo.bar,  autoexec.bat, sendmail.cf 같은 형식의 파일과 매치될 것이다. 이제 이 정규식에 "확장자가 bat인 파일은 제외해야 한다."는 조건을 추가해 보자. 가장 먼저 생각할 수 있는 정규식은 다음과 같을 것이다.

.*[.][^b].*$

이 정규식은 확장자가 b라는 문자로 시작하면 안 된다는 의미이다. 하지만 이 정규식은 foo.bar라는 파일마저 걸러내 버린다. 정규식을 다음과 같이 수정해보자.

.*[.]([^b]..|.[^a].|..[^t])$

이 정규식은 | 메타 문자를 사용하여 확장자의 첫 번째 문자가 b가 아니거나 두 번째 문자가 a가 아니거나 세 번째 문자가 t가 아닌 경우를 의미한다. 이 정규식에 의하여 foo.bar는 제외되지 않고 autoexec.bat은 제외되어 만족스러운 결과를 리턴한다. 하지만 이 정규식은 아쉽게도 sendmail.cf처럼 확장자의 문자 개수가 2개인 케이스를 포함하지 못 하는 오동작을 하기 시작한다.

위의 것을 다음과 같이 바꾸어야 한다.

.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$

확장자의 문자 개수가 2개여도 통과되는 정규식이 만들어졌다. 하지만 정규식은 점점 더 복잡해지고 이해하기 어려워진다.

그런데 여기서 bat 파일말고 exe파일도 제외하라는 조건이 추가로 생긴다면 어떻게 될까? 이 모든 조건을 만족하는 정규식을 구현하려면 패턴은 더욱 더 복잡해져야만 할 것이다.


부정형 전방 탐색

이러한 상황의 구원 투수는 바로 부정형 전방 탐색이다. 위 케이스는 부정형 전방 탐색을 사용하면 다음과 같이 간단하게 처리된다.

.*[.](?!bat$).*$

확장자가 bat가 아닌 경우에만 통과된다는 의미이다. bat라는 문자열이 있는지 조사하는 과정에서 문자열이 소모되지 않으므로 bat가 아니라고 판단되면 그 이후 정규식 매칭이 진행된다.


exe 역시 제외하라는 조건이 추가되더라도 다음과 같이 간단히 표현할 수 있다.

.*[.](?!bat$|exe$).*$




Example

긍정형 전방 탐색으로 .com, .net 이 아닌 것을 걸러내는 예제


'Programming > Python' 카테고리의 다른 글

[REGEX] Substitude  (0) 2016.10.09
[REGEX] 그룹 재활용  (0) 2016.10.08
Python Function : any(), all()  (0) 2014.09.15
이진 트리  (0) 2013.05.31
bisect Module  (0) 2013.05.17
Posted by scii
:

그룹 재활용


'Programming > Python' 카테고리의 다른 글

[REGEX] Substitude  (0) 2016.10.09
[REGEX] 전방 탐색 (Lookahead Assertions), 후방 탐색  (0) 2016.10.08
Python Function : any(), all()  (0) 2014.09.15
이진 트리  (0) 2013.05.31
bisect Module  (0) 2013.05.17
Posted by scii
:


Python 내장 함수 중에 any(), all() 함수가 있다.

any([iterable]) -> Bool

any함수는 반복자를 인자로 받아서 참 혹은 거짓을 반환한다. 

any함수는 인자로 들어온 요소중에 하나라도 참이 되는 것이 있으면, 참을 반환하고, 모두 거짓일때만 거짓만 반환한다.

:: 하나라도 참이면 참을 반환한다!


all([iterable]) -> Bool

all함수는 반복자를 인자로 받아서 참 혹은 거짓을 반환한다.

all함수는 인자로 들어온 요소중에 하나라도 거짓이 되는 것이 있으면, 거짓을 반환하고, 모두 참일때만 참을 반환한다.

:: 모두가 참이면 참을 반환한다!


any, all 함수의 예제)


'Programming > Python' 카테고리의 다른 글

[REGEX] 전방 탐색 (Lookahead Assertions), 후방 탐색  (0) 2016.10.08
[REGEX] 그룹 재활용  (0) 2016.10.08
이진 트리  (0) 2013.05.31
bisect Module  (0) 2013.05.17
multiprocessing Module  (0) 2013.05.17
Posted by scii
:

이진 트리

Programming/Python 2013. 5. 31. 00:18 |


이진 트리의 전위, 중위, 후위 순회 


파이썬으로 코딩하니 정말 간단해진다.






'Programming > Python' 카테고리의 다른 글

[REGEX] 그룹 재활용  (0) 2016.10.08
Python Function : any(), all()  (0) 2014.09.15
bisect Module  (0) 2013.05.17
multiprocessing Module  (0) 2013.05.17
Regular Expression  (0) 2013.05.13
Posted by scii
:

bisect Module

Programming/Python 2013. 5. 17. 21:33 |


bisect : 리스트를 정렬된 상태로 유지

     목적: 리스트에 아이템이 추가될 때마다 정렬 함수를 호출하지 않고 리스트를 정렬된 상태로 유지


bisect 모듈은 리스트가 정렬된 상태를 유지하면서 아이템을 넣을 수 있게 구현돼있다. 

커다란 리스트에 아이템이 들어올 때마다 반복적으로 정렬하는 것보다 이 방식이 더 효율적일 수 있다.


정렬된 상태로 아이템 추가

insort() 를 사용해 리스트가 정렬된 상태를 유지하면서 아이템을 추가하는 예제


결과


위의 예제는 매우 간단하고 리스트의 크기도 작기 때문에 리스트를 생성한 후에 정렬하는 방식이 더 빠를 것이다. 하지만 리스트의 길이가 매우 길어지면 위와 같은 방식을 사용하는 편이 시간과 메모리 낭비를 비약적으로 줄여줄 수 있다.


'Programming > Python' 카테고리의 다른 글

Python Function : any(), all()  (0) 2014.09.15
이진 트리  (0) 2013.05.31
multiprocessing Module  (0) 2013.05.17
Regular Expression  (0) 2013.05.13
Multithread Process  (0) 2013.05.12
Posted by scii
:


multiprocessing : 프로세스를 스레드처럼 관리

목적: 프로세스 관리를 위한 API 제공

버전: 파이썬 2.6 이상


multiprocessing 모듈은 threading API에 기반을 두고 여러 프로세스 간 작업을 나누는 API를 제공한다.

multiprocessing은 threading 대신 사용해 멀티 코어 CPU의 장점을 누리고 파이썬의 글로벌 인터프리터 락(GIL) 의 병목현상을 피하게 할 수 있다.


multiprocessing 모듈은 threading 모듈과 비슷한 API를 가지고 있는 process 기반의 병렬처리 알고리즘이다 python은 Global Interpreter Lock 을 이용하여 병행처리 과정에서 발생할 수 있는 문제를 방지한다. GIL 은 간단한 구현 때문에 계속 사용되어 있지만, CPU 하나만을 사용하는 것을 가정하였기 때문에 현재 처럼 CPU 안에 코어가 여러개 있다고 하더라도, 실제로 병렬처리 되지 않고 한번의 하나의 thread 밖에 처리하지 않는다. 

multiprocessing 모듈은 이러한 문제를 회피하기 위해 process 기반으로 병렬처리를 지원하는 모듈이다


멀티프로세싱 기본

두 번째 프로세스를 생성하기 가장 쉬운 방법은 Process 객체를 인스턴스화하며, 목표 함수를 전달하고 start를 호출하는 것이다.


결과

단어worker가 다섯 번 출력되지만, 각 프로세스가 출력 스트림에 접근하기 위해 경쟁하기 때문에 실행 순서에 따라 결과물이 완전히 깨끗하지 않을 수 있다.


대부분 프로세스를 생성할 때 어떤 작업을 수행해야하는지 인자에 명시하는 편이 더 유용하다. threading 과는 다르게 multiprocessing Process에 인자를 저너달하려면 인자는 pickle을 사용해 직렬화할 수 있어야 한다. 


이 예제는 각 워커 프로세스에 출력할 숫자를 전달한다.


결과




임포트 가능한 목표 함수

threading과 multiprocessing 의 차이점 중 하나는 multoprocessing이 사용하는 __main__에 보호 장치가 더 있다는 점이다. 

새로운 프로세스가 생성되는 방식 때문에 자식 프로세스는 목표 함수를 포함하는 스크립트를 임포트할 수 있어야 한다. 애플리케이션의 메인을 감싸서 모듈이 임포트돼도 각 자식 프로세스에서 __main__ 이 재귀적으로 호출되지 않을음 확인해야 한다.


혹은 또 다른 스크립트에서 목표 함수를 임포하는 방식도 있다. 

예를 들어 mutiprocessing_import_main.py는 두 번째 모듈에서 정의한 워커 함수를 사용한다.




현재 프로세스 판별

인자를 사용해 프로세스를 구별하거나 이름을 붙이는 방식은 번거롭고 필요치도 않다. 각 Process 인스턴스는 기본 값으로 이름이 있고 생성될 때 변경할 수 있다.

프로세스에 이름을 붙이면 추적하기 쉬워지고, 여러 프로세스가 동시에 실행되는 애플리케이션에서 특히 유용하다.


결과

디버그 출력의 각 줄마다 현재 프로세스의 이름이 포함돼 있다. Process-3 이 붙어있는 줄은 이름이 없는 프로세스 worker_1에 대응한다.



데몬 프로세스

메인 프로그램은 기본적으로 모든 자식이 종료될 때까지 끝나지 않는다. 하지만 프로세스를 간섭하기 쉬운 방법이 없는 서비스나, 작업 도중에 죽어도 데이터를 잃거나 훼손하지 않는 프로그램의 경우엔 메인 프로그램이 종료되는 것을 막지 않고 백그라운드에서 실행되는 프로세스가 필요하기도 하다.

프로세스를 데몬으로 지정하려면 daemon 속성을 True로 설정한다. 기본 값은 데몬이 되지 않게 설정돼 있다.


결과

프로그램을 실행하면 데몬 프로세스에게 'Exiting' 메시지가 출력되지 않는데, 이는 데몬 프로세스가 2초간 잠들었다ㅏ 깨어나기 전에 모든 넌데몬 non-daemon 프로세스(메인 프로그램 포함) 가 종료되기 때문이다.


데몬 프로세스는 메인 프로그램이 끝나기 전에 자동으로 종료돼 고아가 되는 것을 방지한다. 

데몬 프로세스가 남아있지 않은지는 실행 중인 프로세스 아이디를 화면에 출력하는 ps 같은 명령어로 확인 할 수 있다.




프로세스간 객체 전달

multiprocessing 은 프로세스간에 객체를 전달하기 위한 두가지 방법을 제공한다.


Queue

Queue 클래스는 Queue.Queue 와 비슷하다.

Queue는 안전하게 thread와 process에서 처리 가능하다.



프로세스 각각의 ID를 보여주는 예제

결과


'Programming > Python' 카테고리의 다른 글

이진 트리  (0) 2013.05.31
bisect Module  (0) 2013.05.17
Regular Expression  (0) 2013.05.13
Multithread Process  (0) 2013.05.12
발생자(Generator)  (0) 2013.05.09
Posted by scii
:

Regular Expression

Programming/Python 2013. 5. 13. 00:50 |


파이썬은 1.5버전부터 re 모듈을 통해 정규 표현식을 지원한다. 


파이썬에 지원하는 정규 표현식은 펄을 대상으로 삼지만, 다음 사항들은 조심해야 한다.

# 조건 달기는 지원하지 않는다.

# \E, \1, \L, \u, \U 를 통한 대소문자 변환은 지원하지 않는다.

# \z 는 지원하지 않는다.


파이썬은 보통 re 모듈에서 정규 표현식을 컴파일 하면 RegexObject 객체를 반환한다. 

이 객체의 match() 메소드나 search() 메소드에 찾고자 하는 문자열을 넘겨주면 다시 MatchObject 객체를 반환하는데, 이 객체에 일치한 텍스트 정보가 포함되어 있다.


RegexObject 객체와 MatchObject 객체에는 다음과 같은 메서드들이 있다.

* match() - 문자열의 시작 부분에서 정규 표현식과 일치하는지 검사한다.

* search() - 문자열의 전체를 훑어서 정규 표현식과 일치하는 부분이 있는지 검사한다.

* findall() - 정규 표현식과 일치한 텍스트를 모두 찾아 리스트 형태로 반환한다.

* finditer() - 정규 표현식과 일치한 텍스트를 모두 찾아 열거자 형태로 반환한다.

* group() - 정규 표현식과 일치한 텍스트를 반환한다.

start() - 정규 표현식과 일치한 텍스트의 시작 위치를 반환한다.

* end() - 정규 표현식과 일치한 텍스트의 마지막 위치를 반환한다.

* span() - 정규 표현식과 일치한 텍스트의 시작 위치와 마지막 위치를 튜플(tuple) 형태로 반환한다.



※ match() 메소드는 시작 부분부터 찾으므로, 일치에 성공했을 때 시작 위치는 항상 0인 반면, search() 메소드는 문자열 전체를 훑으며 찾기 때문에, 시작 위치가 일정하지 않다는 점을 기억해야 한다.



TIP

정규 표현식을 컴파일하지 않고 re 모듈의 메소드에 직접 정규 표현식을 전달해 원하는 결과를 얻을 수 있다. 이는 match(), search(), findall(), finditer() 메소드에 모두 적용할 수 있다.


정규 표현식에서 역슬래시(\)를 일치시키려면 문자 그대로 일치하도록 역슬래시 문자를 이스케이프 해야 한다. 하지만 파이썬에서도 역슬래시가 특별한 의미를 지니고 있기 때문에, 정규 표현식에 역슬래시를 문자 그대로 전달하려면 역슬래시를 이스케이프 하고 이 두 역슬래시에 각각 다시 한번 역슬래시를 추카해야 한다.

즉, 역실래시 문자를 일치시키기 위해서는 정규 표현식 문자열을 \\\\로 표현해야 한다.

이 문제를 해결하려면 파이썬에서 제공하는 raw 문자열을 사용하면 된다. 문자열 앞에 알파벳 r을 붙이는 형식으로 위와 같은 상황에서 정규 표현식 문자열을 r'\\' 와 같이 표현한다.






위치 지정

패턴의 수를 지정하는 것뿐만 아니라 입력된 텍스트에서 패턴이 어느 곳에 위치하는지 지정해줄 수도 있다.


정규 표현식 앵커 부호

  부     호

 의     미 

 ^ 

 문자열이나 줄의 시작 

 $ 

 문자열이나 줄의 끝 

 \A 

 문자열의 시작 

 \Z  

 문자열의 끝 

 \b 

 단어의 시작이나 끝에 있는 공백 문자열 

 \B 

 단어의 시작이나 끝에 있지 않은 공백 문자열열 



결과 값


예제에서 문자열의 시작부분에 위치한 단어를 찾는 방법과 문자열이 끝나는 부분에 위치한 단어를 찾는 방법이 다르다. 그 이유는 문자열의 마지막에 있는 punctuation 이란 단어의 뒤에 마침표가 붙어있기 때문이다. 단순히 \w+$ 패턴을 사용하면 이 단어를 찾아 낼 수 없다. 마침표는 \w 가 의미하는 '숫자나 문자' 범주에 포함되지 않기 때문이다.





패턴에 플래그 넣기

패턴을 라이브러리 함수에 인자로 넘긴다거나 할 때는 표현식에 플래그를 더할 수 없다. 이런 경우에는 표현식 자체에 플래그를 끼워 넣는 방식을 사용한다. 

예를 들어 대소문자를 구별하지 않는 플래그를 켜기 위해선 표현식 앞에 (?i) 를 더한다. 


전체 표현식이 평가되거나 파싱되는 방식을 옵션이 조절하기 때문에 이 옵션은 표현식 앞에 와야 한다.


플래그는 같은 그룹에 조합해서 사용할 수 있다. 예를 들어 (?imu) 는 다중 라인, 유니코드, 대소문자 무시 플래그를 동시에 켠다.

'Programming > Python' 카테고리의 다른 글

bisect Module  (0) 2013.05.17
multiprocessing Module  (0) 2013.05.17
Multithread Process  (0) 2013.05.12
발생자(Generator)  (0) 2013.05.09
반복자(Iterator)  (0) 2013.05.09
Posted by scii
: