티스토리 뷰

전방탐색은 (?=위치패턴)으로 사용한다.

후방탐색은 (?<=위치패턴)으로 사용한다.


아래 코드는 정규표현식 후방탐색을 이용해 text 변수의 값 중 "30"을 가져오는 패턴이다. 문자열은 예시를 든 것으로 30과 40이라는 숫자가 있을 때, "30"의 값만 가져오고 싶었다. 결과는 정상적으로 30이 찍힌다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import re
 
text = '<head> zlzlzlzlzlzlzl 30 </head> 40'
 
// text 변수에서 '30'을 가져오는 패턴
pattern = '(?<=\<\w{4}\>\s\D{14}\s)\d{1,10}'
 
d_c = re.compile(pattern, re.I)
 
result = re.findall(d_c, text)
 
print result
 
===========================================
 
[결과창]
 
>>> 
['30']
cs


아래 코드는 위 코드에서 pattern 변수를 좀 다르게 변경해봤다. 

최종적으로 30을 가져오는 패턴은 같지만, 패턴을 더욱 세밀하게 하기 위해 첫 번째로<head> 옆 부분의 공백이 없다는 것을 가정하여 "?(0개 또는 1개 이상)"를 붙여주었다. 두 번째로는 zlzlzlzlzlzlzl 문자의 개수가 20개까지 늘어날 것으로 예상하여 \D{1,20} 으로 변경하였다.

pattern에서 달라진 것은 "\s => \s?", "\D{14} => \D{1,14}" 부분이다.

하지만, 오류가 발생한다.. (?<=)를 제거하면 정상 동작을 한다. invalid expression... 오류 내용은 더 찾아봐야할 것 같다....

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
import re
 
text = '<head> zlzlzlzlzlzlzl 30 </head> 40'
 
// text 변수에서 '30'을 가져오는 패턴
pattern = '(?<=\<\w{4}\>\s?\D{1,20}\s?)\d{1,10}'
 
d_c = re.compile(pattern, re.I)
 
result = re.findall(d_c, text)
 
print result
 
===========================================
 
[결과창]
 
>>> 
Traceback (most recent call last):
  File "C:test.py", line 6in <module>
    d_c = re.compile(pattern, re.I)
  File "C:\Python27\lib\re.py", line 190in compile
    return _compile(pattern, flags)
  File "C:\Python27\lib\re.py", line 245in _compile
    raise error, v # invalid expression
error: look-behind requires fixed-width pattern
cs


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 29 30 31
글 보관함