python(8) 정규식을 활용한 bs4

hyukstory 혁스토리·2020년 8월 26일
0

python

목록 보기
13/35

정규식을 활용한 bs4 고급스킬

from bs4 import BeautifulSoup
import re


html = """<html> <head><title>test site</title></head> <body> \
    <div><p id="i" class="a">test1</p><p class="d">test2</p></div> \
        <p class="d">test3</p></p> <a href="/example/test1">a tag</a> \
            <b>b tag</b></body></html>"""


soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())

print(soup.find_all(class_=re.compile('d')))    # 해당 문자열이 포함된 요소를 찾는다
print(soup.find_all(id=re.compile('i')))
print(soup.find_all(re.compile('t')))           # 태그에 t가 포함된 요소 찾기
print(soup.find_all(re.compile('^t')))          # 태그 이름이 t로 시작하는 요소 찾기
print(soup.find_all(href=re.compile('/')))      # href에 슬래시(/)가 포함된 요소 찾기

정규식

import re

test_str= "test t1sd j test1"

pattern = re.compile('test')
a = pattern.match(test_str)
b = pattern.search(test_str)
c = pattern.findall(test_str)
d = pattern.finditer(test_str)

print('-- match result --')
print(a)
print(a.group(), a.start(), a.end(), a.span())

print('-- search result --')
print(b)
print(b.group(), b.start(), b.end(), b.span())

print('-- findall result --')
print(c)

print('-- finditer result --')
print(d)
for i in d:
    print(i.group(), i.start(), i.end(), i.span())
import re

test_str= """I am Park Jeong-tae. I live in Paju.
I lived in Paju for 25 years.
Sample text for testing:
abcdefghijklmnopqrsAvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789 _+-.,!@#$%^&*();\/|<>"'
12345 -98.7 3.141 .6180 9,000 +42"""

pattern = re.compile('[0-9]')    # 숫자 한자리씩
pattern1 = re.compile('[0-9]+')  # 숫자 덩어리씩
c = pattern.findall(test_str)
d = pattern1.findall(test_str)

print(c)
print(d)
import re

test_str= """I am Park Jeong-tae. I live in Paju.
I lived in Paju for 25 years.
Sample text for testing:
abcdefghijklmnopqrsAvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789 _+-.,!@#$%^&*();\/|<>"'
12345 -98.7 3.141 .6180 9,000 +42 가나다라마바사 이혁수 얍얍 test testssstt"""

pattern = re.compile('[a-z]')
pattern1 = re.compile('[a-z]+')  # a부터 z까지 하나라도 포함
c = pattern.findall(test_str)
d = pattern1.findall(test_str)

print(c)
print(d)

pattern = re.compile('[A-Z]')    
pattern1 = re.compile('[A-Z]+')
c = pattern.findall(test_str)
d = pattern1.findall(test_str)

print(c)
print(d)


pattern = re.compile('[A-z]')   # 영어 대무자나 소문자 모두 
pattern1 = re.compile('[A-z]+')
e = pattern.findall(test_str)
f = pattern1.findall(test_str)

print(e)
print(f)


pattern = re.compile('[a-zA-Z0-9]+') # a부터 z까지, A부터 Z까지, 0부터 9까지 포함된 것
pattern1 = re.compile('\w+')         # 문자가 하나라도 있으면
c = pattern.findall(test_str)
d = pattern1.findall(test_str)
print(c)
print(d)

pattern = re.compile('[^a-z]+')  # a부터 z까지 포함되지 않는 것
c = pattern.findall(test_str)
print(c)

pattern = re.compile('[^A-Z]+')  # A부터 Z까지 포함되지 않는 것
c = pattern.findall(test_str)
print(c)

pattern = re.compile('t..t')  # t문자문자t 패턴
pattern1 = re.compile('t...t')  # t문자문자문자t 패턴
c = pattern.findall(test_str)
d = pattern1.findall(test_str)
print(c)
print(d)

pattern = re.compile('t?est\w+')  # test나 est로 시작하는 문자열 뒤에 \w가 있어야 됨
pattern1 = re.compile('t?est\w*')  # test나 est로 시작하는 문자열 뒤에 \w가 없어도 됨
c = pattern.findall(test_str)
d = pattern1.findall(test_str)
print(c)
print(d)

전화번호 추출

test_num = "저의 전화번호는 010-6666-7777 입니다"

pattern = re.compile('[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]')  #숫자숫자숫자-숫자숫자숫자숫자-숫자숫자숫자숫자 형태
pattern1 = re.compile('\d\d\d-\d\d\d\d-\d\d\d\d')  #숫자숫자숫자-숫자숫자숫자숫자-숫자숫자숫자숫자 형태
pattern2 = re.compile('\d{3}-\d{4}-\d{4}')  #숫자숫자숫자-숫자숫자숫자숫자-숫자숫자숫자숫자 형태
c = pattern.findall(test_num)
d = pattern1.findall(test_num)
e = pattern2.findall(test_num)
print(c)
print(d)
print(e)


profile
문돌이의 고군분투 개발 공부

0개의 댓글