Python/2.7 information

python re search with newline

qkqhxla1 2019. 9. 23. 14:08

html에서re 모듈로 searching을 할때가 있다.


근데 html내부에 여러가지 js함수가 있고 그중에 특정 함수 안에있는 값을 찾으려고 한다.


예로 이런 경우.

s = '''
<html>
def rara():
asldkfjawefjaiwef

def function():
rara sdfjowefiowe~
var = 'value'

sadflwjeo;fijwoefs

def zozo():
2wefoiawjofewf

'''

여기서 function이라는 함수 내부의 var값을 가져오려고 할때 중간에 rara sdf~이런것들은 다 무시하고자 한다.


단순히 var라는 변수가 하나뿐이면 "var\s+=\s+'(.*?)'"같은 정규식으로 써도 되지만 혹시 모르므로


def funtion():다음에 첫번째로 나오는 var = 이후의 ''안의 값을 찾으려고 한다면..

regex = re.compile("def function\(\):.*?var = '(.*?)'")
print regex.search(s).groups()

요렇게 하면 될것같다. .*?는 중간에 있는것들을 다 무시하고 탐욕스럽지 않게 가장 나중에 나온 var가 아닌 가장 첫번째 나온 var를 찾는거니까. 


근데 문제가 있다. 정규식 .은 newline(\n)에 매칭되지 않아서 결과가 나오지 않는다.


이경우 re.DOTALL옵션을 주면 .이 newline도 매칭이 된다.


import re

s = '''
<html>
def rara():
asldkfjawefjaiwef

def function():
rara sdfjowefiowe~
var = 'value'

sadflwjeo;fijwoefs

def zozo():
2wefoiawjofewf

'''

regex = re.compile("def function\(\):.*?var = '(.*?)'")
print 'cannot find =',regex.search(s)

regex = re.compile("def function\(\):.*?var = '(.*?)'", re.DOTALL)
print 'find! =',regex.search(s).groups()


참고 : https://riptutorial.com/regex/example/32238/why-doesn-t-dot-----match-the-newline-character----n---