2018년 6월 28일 목요일

Python RE

반복 메타 문자 * + ? {} 는 그 앞글자가 몇번 나오는지 설정
match = re.search('ap*le', s1) # p가 0회 이상 반복 되는 것을 찾아 달라. OK : apple, appple, ale.match = re.search('ap+le', s1) # p가 1회 이상 반복 되는 것을 찾아 달라. OK : aple, apple, appple. NG : alematch = re.search("ap?le", s1) # p가 0 또는 1회. OK : ale, aple. NG : apple
match = re.search('ap{2}le', s1) # p가 2번만 반복된 것만 찾는다. OK :apple  NG : aple, appplematch = re.search('ap{2, 5}le', s1) # p가 2번, 또는 3번, 또는 4번 또는 5번 반복된 것만 찾는다. OK :apple, appple, apppple  NG : aple
매칭 메타 문자 . []
match = re.search('ki.i', s1) # .은 개행을 제외한 모든 문자를 허용. OK : kiwi ki3i kixi ki#i ki?i "ki i"   NG : ki\nimatch = re.search('^app', s1)  # ^은 문자열이 주어진 패턴으로 시작하면 매칭 됨. s1이 app로 시작한다면 찾음. NG : ^kiwimatch = re.search("nna$", s1) # $는 문자열이 주어진 패턴으로 끝나는지 확인. s1이 nna로 끝나면 찾음.
match = re.search('[abcxz]pple', s1) # []문자의 집합 중 한문자가 대신할 수 있다. OK : apple, bpple, cpple     NG : dpplematch = re.search('ki[vwx]i', s1) # []문자의 집합 중 한문자가 대신할 수 있다. OK : kiwi kiwwwwi kivwvwvwi    NG kiwwaxximatch = re.search('ki[a-z]i', s1) # []문자 범위   OK : kixi    NG : kiXimatch = re.search('ki[a-z]+i') # OK : kidaljdlkajdklajdlkalkji  NG : kikjklj2i kiWdsdai
match = re.search('서울[시은가]', s2) # OK 서울시 서울은 서울가 NG 서울이match = re.search('서울[가-힣]', s2)  # 모든 한글글자 1개  OK : 서울이 서울락 서울흘  NG: 서울2 서울s
match = re.search('ki[a-zA-Z0-9]+i') # OK : kiai kiZi ki0i    NG: ki#i ki?i
match = re.search('melon|banana') # melon 또는 banana면 됨.match = re.search('melon|ba+na') #
escape \d
match = re.search('ki\di') # ki[0-9]i와 같음. OK : ki0i ki1i ki2imatch = re.search('ki[\da-z]i') # ki[0-9a-z]i와 같음.match = re.search('ki[\da-z. ]') # OK: ki0. 찾아줌
Search는 첫번째 것만 찾아 줌. 매칭 되는 것 다 찾고자 하면 findAll을 써야 함. 그 결과는 list 객체.
match = re.search('app[a-z]+') # app, applicationsList = re.findall('app[a-z]+', s1)

[] 안의 ^은 not 의 의미 임. []밖과 다름.
\D는 [^0-9] 숫자가 아님을 의미

match = re.search('ki\Di')  # OK : ki#a  NG ki5i
\s 화이트 스페이스 (탭, 개행, 스페이스)
match = re.search('ki\si')  # OK : ki i, ki    i
\S 화이트 스페이스가 아닌 것
match = re.search('ki\Si')  # OK : kiwi ki#i ki9i
\w 숫자, 영어 대소문자, _
match = re.search('ki\wi') # ki_i kiwi kiWi ki9i
\W 숫자, 영어, 대소문자, _ 가 아닌 글자.

s3에서 숫자3개-소문자3개
match = re.search('\d{3}-[a-z]{3}', s3)

() 그룹
match = re.search('(\d{3})-([a-z]{3})', s3)
print(match.groups(), match.groups(1), match.groups(2) ,sep='\n')

print(match.group())


# []밖과 안에서 의미가 다른 문자들이 있다.# .는 []밖에서는 줄바꿈을 제외한 모든 문자. []안에서는 그냥 .이다. escape 안해 도 됨.# ^는 []밖에서는 시작점. []안에서 첫자리에 쓰이면 가령 [^OOO] 이면 OOO의 negation이다.
# group은 1번이 첫번째 그룹 괄호를 의미 함.
# ASCII에서 \b는 벨소리임. 그런데 정규식에서도 \b는 공백 escape 의미로 씀.# 때문에 ASCII 코드가 아니라, 정규식 \b 공백으로 하기 위해서는 매칭 앞에 r을 붙여줘야 한다.import re
s1 = "apple kiwi banana appple ale application"s2 = "서울시 은평구"s3 = "123-abc def-ghi jkl-23 566-Abc"s4 = '<a href="test.html"> <img src="my.jpg"> </a> <div> aaa</div>'s5 = 'abc$ 192.168.12.240 --  22^352 [01/Apr/2016:12:39:00 +0900] "GET /bg-middle.png HTTP/1.1" 200 1918's6 =  "aaa bbb.ccc.dd@aa.co.kr 123ffg my_test@my.co.kr"s8 = "sdsadPYTHON like"s9 = "abc\ng"s10 = '''python testprogram hello ppp aaaphone my'''s11 = 'abc#def ghi-jkl'
match = re.search('\d+.\d+.\d+.\d+', s5)
print(match.group())
s = re.sub('app\w+', 'like', s1) # 앞 패턴의 문자들을 뒤 문자열로 바꿔 줌print(s)

my = ['love', 'like', "like", "love"]
cnt = -1def fn(x):
    global cnt
    cnt += 1    return my[cnt]+x.group()

s = re.sub('app\w+', fn, s1)
print(s)

# 함수의 정적 변수 사용하는 방법def fn(x):
    fn.cnt += 1    return my[fn.cnt]+x.group()
fn.cnt = -1  # 함수 선언 밑에 초기 값을 적어 준다.
s = re.sub('app\w+', fn, s1)
print(s)

# match = re.search('href=\"(\w+.?\w+?)\"', s4)match = re.search('\[([\w/:]+)', s5)
match = re.search('GET /(\S+)', s5)
match = re.search('\d+$', s5)
ml = re.findall('[\d^]+', s5)
ml = re.findall('\w+$', s5)
print(ml)

match = re.search("pY", s8, re.I) # Ignore casematch = re.search("abc.g", s9, re.DOTALL) # .이 개행까지 대신할 수 있게 함.match = re.search(r"^p\w+\s+\w+", s10, re.M) # ^는 전체 문자열의 시작을 의미하지만, re.M을 추가하면 각 라인별 시작으로 바꿔 줌.
com = re.compile("app\w+")  # 같은 패턴을 다른 스트링에 적용하고자 할 때는 미리 컴파일 해 둔 것을 사용하면, 속도가 더 빠름.match = com.search(s1)

s = re.split("[# -]", s11) # 주어진 문자들로 스트링을 잘라 냄.print(s)

if match:
  print(match.group())
else:
  print("not found")

fi = re.finditer('app\w+', s1) # match 객체 generator를 돌려 줌.fi = re.finditer('(\S+)@\S+', s6) # match 객체 generator를 돌려 줌.ml = re.findall('(\S+)@\S+', s6) # match 객체 generator를 돌려 줌. 첫번째 항목의 group list를 돌려 줌.
for i in fi:
    print(i.group(1))

# if match:#   print(match.group())# else:#   print("not match")
# try:#     반복 메타 문자 * + ? {} 는 그 앞글자가 몇번 나오는지 설정#     match = re.search('ap*le', s1) # p가 0회 이상 반복 되는 것을 찾아 달라. OK : apple, appple, ale.#     match = re.search('ap+le', s1) # p가 1회 이상 반복 되는 것을 찾아 달라. OK : aple, apple, appple. NG : ale#     match = re.search("ap?le", s1) # p가 0 또는 1회. OK : ale, aple. NG : apple##     match = re.search('ap{2}le', s1) # p가 2번만 반복된 것만 찾는다. OK :apple  NG : aple, appple#     match = re.search('ap{2, 5}le', s1) # p가 2번, 또는 3번, 또는 4번 또는 5번 반복된 것만 찾는다. OK :apple, appple, apppple  NG : aple##     매칭 메타 문자 . []#     match = re.search('ki.i', s1) # .은 개행을 제외한 모든 문자를 허용. OK : kiwi ki3i kixi ki#i ki?i "ki i"   NG : ki\ni#     match = re.search('^app', s1)  # ^은 문자열이 주어진 패턴으로 시작하면 매칭 됨. s1이 app로 시작한다면 찾음. NG : ^kiwi#     match = re.search("nna$", s1) # $는 문자열이 주어진 패턴으로 끝나는지 확인. s1이 nna로 끝나면 찾음.##     match = re.search('[abcxz]pple', s1) # []문자의 집합 중 한문자가 대신할 수 있다. OK : apple, bpple, cpple     NG : dpple#     match = re.search('ki[vwx]i', s1) # []문자의 집합 중 한문자가 대신할 수 있다. OK : kiwi kiwwwwi kivwvwvwi    NG kiwwaxxi#     match = re.search('ki[a-z]i', s1) # []문자 범위   OK : kixi    NG : kiXi#     match = re.search('ki[a-z]+i') # OK : kidaljdlkajdklajdlkalkji  NG : kikjklj2i kiWdsdai##     match = re.search('서울[시은가]', s2) # OK 서울시 서울은 서울가 NG 서울이#     match = re.search('서울[가-힣]', s2)  # 모든 한글글자 1개  OK : 서울이 서울락 서울흘  NG: 서울2 서울s##     match = re.search('ki[a-zA-Z0-9]+i') # OK : kiai kiZi ki0i    NG: ki#i ki?i##     match = re.search('melon|banana') # melon 또는 banana면 됨.#     match = re.search('melon|ba+na') ###     escape \d#     match = re.search('ki\di') # ki[0-9]i와 같음. OK : ki0i ki1i ki2i#     match = re.search('ki[\da-z]i') # ki[0-9a-z]i와 같음.#     match = re.search('ki[\da-z. ]') # OK: ki0. 찾아줌##     Search는 첫번째 것만 찾아 줌. 매칭 되는 것 다 찾고자 하면 findAll을 써야 함. 그 결과는 list 객체.#     match = re.search('app[a-z]+') # appa, application#     sList = re.findall('app[a-z]+', s1)##     [] 안의 ^은 not 의 의미 임. []밖과 다름.#     \D는 [^0-9] 숫자가 아님을 의미##     match = re.search('ki\Di')  # OK : ki#a  NG ki5i##     \s 화이트 스페이스 (탭, 개행, 스페이스)#     match = re.search('ki\si')  # OK : ki i, ki    i##     \S 화이트 스페이스가 아닌 것#     match = re.search('ki\Si')  # OK : kiwi ki#i ki9i##     \w 숫자, 영어 대소문자, _#     match = re.search('ki\wi') # ki_i kiwi kiWi ki9i##     \W 숫자, 영어, 대소문자, _ 가 아닌 글자.##     s3에서 숫자3개-소문자3개#     match = re.search('\d{3}-[a-z]{3}', s3)##     () 그룹#     match = re.search('(\d{3})-([a-z]{3})', s3)#     print(match.groups(), match.groups(1), match.groups(2) ,sep='\n')##     print(match.group())#     #print(sList)# except Exception as err:#     print("not found")

댓글 없음:

댓글 쓰기