URL 교체하기

Programming/RegEx 2013. 2. 3. 21:53 |

http:로 시작하는 URL을 <a href="URL">URL</a> 로 교체하기


이 작업을 하려면 우선적으로 URL 주소만을 찾는 정규 표현식 패턴을 만드는 것이 첫 번째로 할 일이다.

다음으로, 검색 결과를 백레퍼런스로 사용해서 교체한다. 


원본   


URL을 검색하는 정규 표현식


검색된 URL


URL을 다른 형식으로 바꿔주고 있다.


바뀐 최종적인 URL


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

정규 표현식(Regualr Expression)  (0) 2013.05.05
태그 찾기  (0) 2013.02.12
[Python] Regular Expression  (0) 2013.02.07
정규 표현식의 활용(이메일 주소 변경)  (0) 2013.02.03
POSIX 정규 표현식  (0) 2013.02.03
Posted by scii
:

이메일 주소를 찾아내는 정규식


정규 표현식에서 대쉬는 범위를 나타내는 문자로도 사용되므로, 하이픈 자체를 가리킬 때는 역슬래쉬로 이스케이프한다. 그러나 마침표는 대괄호 안에서 메타 문자의 의미를 잃기 때문에 이스케이프할 필요가 없다.

[a-zA-Z0-9.\-]\+@[a-zA-Z0-9.\-]\+

여기서 +도 이스케이프했다는 사실에 주의해야 한다. 이는 vim에서 + 기호를 특수한 목적으로 사용하기 때문이다.



검색한 메일 주소를 <a href="메일 주소"> 메일주소</a> 형식으로 변경하기


검색된 메일 주소 부분을 재사용하기 위해 정규 표현식의 백레퍼런스 기능인 소괄호를 사용해야 한다.

소괄호를 추가한 ([a-zA-Z0-9.\-]\+@[a-zA-Z0-9.\-]\+) 검색어로 다시 검색해보자.

※ 완벽한 정규 표현식을 만들 때까지는 검색 기능으로 꼭 확인을 해야 한다.


하지만 정규 표현식 패턴을 소괄호로 묶으니 검색이 실패했다. 

실패한 이유는, 패턴 앞뒤에 사용된 괄호 문자를 일반 문자로 인식했기 때문이다. 즉, vim은 '(메일주소)' 형태를 찾으려고 한 것이다.

그러므로 소괄호를 이스케이프하여 \(메일주소\) 형식으로 바꿔줘야 한다.




검색한 이메일 주소 변경하기

\1 은 앞부분에서 찾은 검색 결과를 재사용하는 백레퍼런스이다.


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

정규 표현식(Regualr Expression)  (0) 2013.05.05
태그 찾기  (0) 2013.02.12
[Python] Regular Expression  (0) 2013.02.07
URL 교체하기  (0) 2013.02.03
POSIX 정규 표현식  (0) 2013.02.03
Posted by scii
:

POSIX 표준 정규 표현식에 익순해진 뒤에는 더 많은 기능을 가진 펄(Perl) 확장 정규 표현식인 PCRE(Perl Compatible Regular Expression) 도 배워두면 좋다.

PCRE는 대부분의 언어에서 라이브러리를 제공하므로 확장성도 뛰어나다.


정규 표현식의 메타 문자들

문자 지정 

임의의 문자 하나를 의미

반복 지정 

문자 패턴이 0개 혹은 1개를 나타냄

 

문자 패턴이 1개 이상 반복 

 

문자 패턴이 0개 이상 반복 

 

{ ... } 

(interval) 반복수를 직접 지정할 수 있다. 예를 들어, {3}은 3번 반복, {,7}은 일곱 번 이하 반복, {2,5}은 두 번 이상, 다섯 번 이하  반복

위치 지정 

행의 맨 앞을 의미 

 

행의 맨 끝을 의미 

그룹 지정 

[ ... ] 

대괄호 안에 지정된 문자 중 한 문자를 지정 

 

 [ ^... ]

대괄호 안에 지정된 문자를 제외한 나머지(여집합)를 지정 

기타 

메타 문자를 이스케이프(escape) 한다 

 

OR 연산을 한다(alternation) 

 

( ) 

패턴을 그룹화하거나 백레퍼런스로 작동 

POSIX 표준 정규 표현식은 문자, 반복, 위치, 범위, 기호의 메티 문자로 구성되며, 기본 패턴은 위와 같이 다섯 개 그룹으로 나눌 수 있다.


문자 지정 그룹

메타 문자에서 마침표(.)는 임의의 문자 하나를 의미한다. 영문자나 숫자, 기호 등 어느 것이든 하나의 문자와 일치한다. 따라서 t...k 처럼 작성하면, t와 k사이에 임의의 문자 세 개가 들어있는 단어(think나 thick 등)가 매칭된다.


반복 지정 패턴

반복을 지정하는 메타 문자(?, +, *, {...}) 는 바로 앞에 있는 문자나 패턴의 반복수를 지정한다.


?는 바로 앞의 문자에 대해 0개 혹은 1개와 일치한다. 예를 들어 a?b 라고 하면 ?앞에 있는 a가 있거나 없다는 뜻이된다. 따라서 a?b 는 b 혹은 ab와 매칭된다.

만일 a.?s 가 되면 a 다음에 임의의 문자(.)가 0개 혹은 1개 나오고 그 뒤에 s가 있는 문자(as, abs, ats 등)와 매칭된다.


+는 바로 앞의 문자에 대해 1개 이상과 일치하며, *는 바로 앞의 문자에 대해 0개 이상과 일치한다. 

예를 들어 a+b라고 하면 a가 하나 이상 앞에 나오고, b가 뒤따르는 문자(ab, aab, aaab 등) 와 일치하며, 

a*b 라고 하면 a가 0개 이상 앞에 나오고 b가 뒤따르는 문자(b, ab, aab 등)와 일치한다.


마지막으로 사용자가 임의의 반복수를 지정할 수 있는 메타 문자는 중괄호( { } ) 로 감싸서 표시한다. 중괄호 안에는 최소, 최대 반복수를 지정할 수 있는데, 예를 들어 {2,5}라고 하면 바로 앞의 문자가 최소 2번 이상, 최대 5번 이하 반복된다는 의미이다. 

반복수 중에 앞부분을 생략하여 {,5} 라고 하면 0번 이상, 다섯 번 이하라는 의미이고, 뒷 부분을 생략하여 {2, } 라고 하면 최대 반복에 제한이 없다는 의미이다.

따라서 0개 혹은 1개와 일치하는 ?는 {0,1}로 쓸 수 있고 1개 이상을 의미하는 +는 {1, } 로 쓸 수 있다. 또 0개 이상을 의미하는 *는 {0, }와 같다.


※ a* 같은 표현식을 만날 때,

단독으로 a* 나 [0-9]* 같이 표현식을 작성하는 경우를 종종 보게 되는데, 이는 모든 문자와 알치하므로 잘못된 표현식이라 할 수 있다. 따라서 * 기호 앞에 문자가 하나만 있는 표현식이라면 잘못 작성했다고 판단하면 된다.

이런 경우에는 * 대신 + 를 사용하는 편이 좀 더 정확한 표현식을 작성할 수 있다.


위치 지정 패턴

위치를 지정하는 기호는 ^과 $이다. 일반적으로 ^는 행의 시작을 의미하고, $는 끝을 의미한다. 예를 들어 ^abc 라고 하면 행의 시작 부분에 있는 abc와 일치하고, boy$라고 하면 행의 끝 부분에 있는 boy와 일치한다. 

이를 응용하여 ^$라고 하면, 행의 시작과 끝 사이에 아무것도 없는 행, 즉 비어있는 행과 일치한다.

여기서는 행 단위에 국한되었지만 가끔 ^, $가 특정 스트림의 맨 앞과 맨 끝을 의미하기도 한다. 


그룹 지정 패턴

그룹을 지정하는 패턴은 [...]와 [^...]로 구분할 수 있다. [...]는 괄호 안에 지정된 문자 중 하나와 일치한다는 의미이다.반대로 [^...]는 괄호 안에 지정된 문자를 제외한 나머지 문자와 일치한다는 의미이다. 

예를 들어 [abc]는 a, b, c 중 하나를 의미한다.

여기에 범위를 적용할 수도 있다. [a-z]는 알파벳 소문자(a부터 z까지)를 의미하고, [0-9]는 숫자(0부터 9)를 의미한다. 복합적인 범위를 적용하여 [a-zA-Z0-9] 처럼 알파벳 대소문자와 숫자 중 하나를 지정할 수도 있습니다.

그룹 패턴은 종종 반복 지정 패턴과 함께 나타나기도 한다. 예를 들어 [a-zA-Z]+ 는 하나 이상(+) 의 대소문자 알파벳([a-zA-Z]) 과 일치한다는 의미이다.


이스케이프

이스케이프(escape)는 백슬래쉬(\) 로 표현되며, 메타 문자의 의미를 없애주는 역할을 한다. 반복 지정 패턴인 * 문자 앞에 백슬래쉬를 붙이면 반복의 의미가 사라지고, 그냥 *문자 자체와 일치한다. 이를 '이스케이프' 라고 한다.


얼터네이션

얼터네이션(alternation) 은 | 으로 표현되며 OR 연산을 의미합니다. 얼터네이션은 대부분 중괄호 기호와 함께 사용됩니다. 예를 들어 (a | b)c 라고 하면 a나 b 중 하나로 시작하며 뒤이어 c가 나타나는 문자(ac, bc)와 일치한다.

단 중괄호에는 백레퍼런스(back reference) 의 의미도 있다는 것을 주의해야 한다.


그룹 지정과 백레퍼런스(/)

그룹(grouping) 이나 백레퍼런스(back-reference) 를 지정할 때는 중괄호가 사용된다. 백레퍼런스는 정규 표현식으로 매칭된 결과 값을 저장해두었다가 변수처럼 사용할 수 있는 기능이다. 


문자 클래스

POSIX 정규 표현식에서의 몇몇 문자 그룹 표 (사용자가 그룹 지정 패턴으로 직접 만들 수 있다)

POSIX 표준 정규 표현식의 문자 클래스

 [[:alnum:]]

알파벳과 숫자 

 [[:alpha:]]

알파벳 대소문자 

 [[:blank:]]

 탭(\t)

[[:cntrl:]] 

제어 문자 

[[:digit:]] 

숫자 

[[:xdigit:]] 

16진수(hex)형 숫자, 즉 [0-9a-fA-F] 

 [[:upper:]]

알파벳 대문자 

[[:lower:]] 

알파벳 소문자 

[[:space:]] 

탭(\t), CR(\r), LF(\n) 

[[:print:]] 

출력 가능한 문자 

 [[:graph:]]

공백을 제외한 문자 

[[:punct:]] 

출력 가능한 특수 문자 

이들 중 alnum, alpha, digit, xdigit은 주로 사용된다.



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

정규 표현식(Regualr Expression)  (0) 2013.05.05
태그 찾기  (0) 2013.02.12
[Python] Regular Expression  (0) 2013.02.07
URL 교체하기  (0) 2013.02.03
정규 표현식의 활용(이메일 주소 변경)  (0) 2013.02.03
Posted by scii
:

비트 연산자를 소개할 때... 꼭~ 나오는... "임의의 정수를 입력받아서 비트단위로 출력해주는 함수"

C언어를 공부할 때 했던 방식으로.. shift 비트연산자와 & 비트연산자를 가지고 Python에서 작성해보았다.

파이썬이 정말 간단하긴하다. Good!


위의 x != 0 은 불필요함. 이렇게만 해도 된다.


자료구조를 공부하는데 선형 자료구조는 모두 끝마추었다. 이제 비선형 자료구조를 시작하는데... Python 이랑 병행하면서 공부를 하려고 한다.

C언어로 자료구조 공부하고, 그것을 다시 Python에서는 어떻게 이뤄질지 생각하면서 Python에서 다시금 코딩을 하려한다.

이렇게 병행하면 복습도 자연스레 되고~~ 파이썬의 자료구조도 정말 깊이있게 이해할 수 있을것이다. 

Python Start!!!


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

사전을 이용한 포매팅  (0) 2013.02.08
str 과 repr  (0) 2013.02.08
논리 연산자  (0) 2012.11.26
관계 연산자(<,>,<=,>=,==,!=)  (0) 2012.11.26
Decimal 자료형  (0) 2012.11.26
Posted by scii
:

Python IDLE과 에디터의 컬러 테마는 기본적으로 설치되어있지 않다. 그래서 사용자가 직접 설치를 해야한다.

컬러 테마는 밑에 있는 링크에서 얻을 수 있다.

https://gist.github.com/1554778


제공되는 테마는 tango, desert, obsidian 이렇게 3종류가 있다. 

원하는 테마의 소스를 copy & paste 한 후, config-highlight.cfg 라는 이름으로 저장한다. 

그 후, [사용자 - 현재 사용하는 사용자 디렉토리 - idlerc 디렉토리] 에 해당 파일을 넣어주면 된다.

리눅스에서는 .idlerc이다.


※ 테마파일이 .idlerc 디렉토리에 없으면 활성화가 되지 않는다.


Obsidian 테마로 바꾼 모습.






내가 customizing 한 IDLE Theme


압축을 푼 후, C:\Users\Administrator\.idlerc 경로에 덮어씌어주기만 하면 된다.

리눅스를 쓴다면, $HOME/.idlerc 경로에 덮어씌어주면 된다.

idlerc_130221.zip



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

윈도우환경을 리눅스환경처럼  (0) 2013.02.19
Python IDLE 한글 설정  (0) 2013.02.13
Visual Studio 디버깅하는 방법  (0) 2013.01.03
Eclipse 단축키  (0) 2012.12.26
Eclipse 테마 설정  (0) 2012.12.26
Posted by scii
:

덱을 기반으로 큐를 쓸 수 있다면, 덱을 기반으로 스택도 쓸 수 있단 소리다.






'Programming > Data Structure' 카테고리의 다른 글

이진 트리의 순회 (Traversal)  (0) 2013.05.28
트리(Tree)  (0) 2013.05.21
덱 (Deque)  (0) 2013.01.30
큐의 연결 리스트 기반 구현  (0) 2013.01.29
큐의 배열 기반 구현  (0) 2013.01.29
Posted by scii
:



Posted by scii
:

덱의 이해

- 덱은 앞으로도 뒤도로 넣을 수 있고, 앞으로도 뒤도로 뺄 수 있는 자료구조이다.


deque은 double-ended queue를 줄여서 표현한 것으로, 양방향으로 넣고 뺄 수 있는다는 사실에 초점이 맞춰져서 지어진 이름이다.

덱은 양방향으로 넣고, 양방향으로 뺄 수 있는 자료구조이기에 스택과 큐의 특성을 모두 갖는, 혹은 스택과 큐를 조합한 형태의 자료구조로 이해되고 있다.


덱 자료구조의 ADT

void DequeInit(Deque * pdeq);

- 덱의 초기화 진행

int DQIsEmpty(Deque * pdeq);

- 덱이 빈 경우 true, 아니면 false

void DQAddFirst(Deque * pdeq, Data data);

- 덱의 머리에 데이터를 저장

void DQAddLast(Deque * pdeq, Data data);

- 덱의 꼬리에 데이터를 저장

Data DQRemoveFirst(Deque * pdeq);

- 덱의 머리에 위치한 데이터를 반환, 소멸

Data DQRemoveLast(Deque * pdeq);

- 덱의 꼬리에 위치한 데이터를 반환, 소멸

Data DQGetFirst(Deque * pdeq);

- 덱의 머리에 위치한 데이터를 소멸하지 않고 반환

Data DQGetLast(Deque * pdeq);

- 덱의 꼬리에 위치한 데이터를 소멸하지 않고 반환


※ 참고로 Deque는 '디큐'로 읽기 쉽다. 그럼에도 불구하고 '덱'으로 발음하는 이유는 '디큐'로 발음할 경우 큐의 dequeue 연산과 그 발음이 같아져서 이 둘을 구분하기 어렵기 때문이다. 이것이 크게 중요한 것은 아니지만, 혼란을 줄 수 있으므로 가급적 '덱'으로 읽으면 좋다.


덱의 구현

덱도 큐와 마찬가지로 배열을 기반으로, 그리고 열결 리스트를 기반으로도 구현이 가능하다. 

하지만 덱의 구현에 가장 어울린다고 알려진 '양방향 연결 리스트'를 기반으로 덱을 구현하는 것이 좋은 선택일 수 있다.

양방향 연결 리스트가 단방향 연결 리스트보다 덱의 구현에 더 잘 어울리는 이유는 다음 함수의 구현과 관련이 있다. 

Data DQRemoveLast(Deque * pdeq);    // 꼬리에 위치한 데이터 삭제

위의 함수는 꼬리에 위치한 노드를 삭제하는 함수인데 노드가 양방향으로 연결되어 있지 않으면, 꼬리에 위치한 노드의 삭제는 간단하지 않다. 때문에 덱의 구현에 있어서 양방향 연결 리스트는 매우 좋은 선택이라 할 수 있다.


Header file

Source file

Main file

실행 결과


'Programming > Data Structure' 카테고리의 다른 글

트리(Tree)  (0) 2013.05.21
덱을 기반으로 큐를 구현  (0) 2013.01.30
큐의 연결 리스트 기반 구현  (0) 2013.01.29
큐의 배열 기반 구현  (0) 2013.01.29
큐(Queue)  (0) 2013.01.16
Posted by scii
: