파이썬 문법 및 유용한 코드를 모아놓은 곳입니다.
INDEX
문자열 관련 메소드
# 문자열 뒤집기
s = s[::-1]
# 문자열 교체(공백 or 특정문자제거)
s = s.replace(' ', '')
import re
s = re.sub(r'[^a-zA-Z0-9]','',s)
# 문자열 나눔
s = 'h e l l o'
s.split(' ')
= ['h','e','l','l','o']
list(s)
[char for char in s]
# 문자열 연결
list = ['h','e','l','l','o']
''.join(list)
= hello
# 문자열 판단
'year2017'.isalnum()
= True
'year2017!!!'.isalnum()
= False
# 문자열 길이
len('hello')
= 5
# 문자열 검색
'hello'.find('l')
= 2
# find와 동일, 없을 때 예외를 발생
'hello'.index('l')
= 2
'l' in 'hello'
= True
'l' not in 'hello'
= False
리스트 관련 함수
# 알파벳 생성하기
from string import ascii_lowercase
list(string.ascii_lowercase)
list(map(chr, range(97, 123)))
[chr(i) for i in range(ord('a'),ord('z')+1)]
# 리스트 뒤집기
l.reverse()
# List Comprehensions 방식으로 생성하기
l = [i * i for in range(10) ]
l = [i for i in L if i % 3 == 0) ]
# 2차원 배열 동적 생성(다익스트라)
graph = [[[0] for x in range(n)] for y in range(n)]
for items in lists:
graph[items[0]-1][items[1]-1] = items[2]
# 리스트 안에 값 확인
print(5 in l)
print(5 not in l)
# 리스트 값 추가
l.append(val) # 값 추가
l.insert(index, val) # 값 추가
l.extend(iterable) # iterable 인자를 넘겨 리스트에 추가
l.extend(range(10,13)) # 10~12까지
# 리스트 값 삭제
del(l[index]) # 특정 인덱스 삭제
del(l) # 리스트 자체 삭제
l.pop(index) # 특정 인덱스 위치의 값을 리턴하면서 삭제
l.remove(val) # 전달한 값을 삭제
l.clear() # 리스트 값 모두 삭제(빈 리스트 생성)
# 리스트 정렬
l.sort() # 오름차순 정렬
l.sort(reverse=True) # 내림차순 정렬
# 리스트 길이
len(l)
# 리스트 슬라이싱
l[::2] # 리스트에서 짝수번째만 가져옴
sum(sorted(nums)[::2]) # 리스트 정렬 후 짝수번째만 합치기
# 리스트 문자열 합치기
A = ["a", "b", "c"]
l = "".join(A)
# 리스트 내부 정렬
# 띄어쓰기 기준으로 나눈 뒤 사전식 정렬, 같을 경우 맨 앞 기준 정렬
l.sort(key=lambda x : l.split()[1:], l.split()[0])
# defaultDict를 탐색할 때
# list()로 감싸줘야 key size changed 에러 발생 방지
for item in list(newDict):
#----
정규표현식(re모듈)
- 주요 메소드
import re
# 특수문자 제거
s = re.sub(r"[^a-zA-Z0-9]","",s)
# 동일한 구문을 많이 써야하는 경우 정규식 객체를 반환
c = re.compile('[0-9]')
# 문자열 전체에서 검색
re.search('[a-z]', '123abc45').start()
= 3
re.search('[a-z]', '123abc45').end()
= 4
re.search('[a-z]+', '123abc45').start()
= 3
re.search('[a-z]+', '123abc45').end()
= 6
# 문자열 전체에서 일치하는 모든 부분을 검색
re.findall('[a-z]','123abc45')
= ['a', 'b', 'c']
re.findall('[a-z]+','123abc45')
= ['abc']
- 자주 쓰이는 예시
[Pp]ython : Python 혹은 python
[^aeiou] : 소문자 모음 제외
^abc : abc로 시작해야함
xyz$ : xyz로 종료되어야함
\d{3} : 숫자가 3개 있어야 함
\d+ : 숫자가 1개 이상
\d? : 숫자가 1개던지 없던지
- 반복횟수
* : 0회 이상 반복
+ : 1회 이상 반복
? : 0회 or 1회
{m} : m회 반복
{m,n} : m회에서 n회까지 반복
- 매칭조건
. : 줄바꿈 문자를 제외한 모든 문자와 매치됨
^ : 문자열의 시작과 매치
$ : 문자열의 마지막과 매치
[] : 문자 집합 중 하나 ex : [0-9]
| : 또는(or)을 의미
{} : 정규식을 그룹으로 묶음
- 이스케이프 기호
\ : 역슬래쉬 문자 자체
\d : 모든 숫자 [0-9]
\D : 숫자가 아닌 문자 [^0-9]
\w : 숫자 또는 문자와 매치됨
\W : 숫자 또는 문자가 아닌 것과 매치됨
\b : 단어(숫자, 영문자의 연속)의 경계
\B : 단어(숫자, 영문자의 연속)의 경계가 아닌 것
ex : Raindrops on roses, and whiskers on kittens.
위 문장에서 단어의 경계, 즉 메타 문자 \b 는 아래와 같이 | 를 표시한 위치를 가리킨다.
|Raindrops| |on| |roses|, |and| |whiskers| |on| |kittens|.
이 문장에서 /\bo.\b/ 를 매치시킨 결과는 다음과 같다.
|Raindrops| |on| |roses|, |and| |whiskers| |on| |kittens|.
패턴이 단어의 경계 사이에 있는 o와 나머지 한 문자를 나타내기 때문이다.
\B 는 \b와 반대로 동작하는데, 이것도 각 위치를 표시해보면 이해하기 쉽다.
R|a|i|n|d|r |o|p| s o|n r| o|s| e|s, a|n|d w|h|i|s|k|e|r|s o|n k|i|t|t|e|n|s.
\A : 문자열의 처음에만 일치
\Z : 문자열의 끝에만 일치
\s : 공백문자 [\t\n\r\f\v]
\S : 공백문자가 아닌 것 [^\t\n\r\f\v]
- 플래그
X, VERBOSE : 정규식 안의 공백을 무시
I, IGNORECATE : 대소문자를 구별하지 않는다.
List Comprehention
string1 = 'abc'
string2 = 'acc'
# 문자열에서 한글자씩 뽑아서 출력
char for char in string
= ['a', 'b', 'c']
# 문자열1에 있는 글자가 2에 있는지 출력
char in string2 for char in string
= [True, False, True]
# 문자열1에 있는 글자가 2에 몇개나 있는지 출력
sum(char in string2 for char in string)
= 2
유용한 함수
# 프로그래머스 로그 찍기
import logging
logging.warning('tempList : {}'.format(tempList))
# zip() = 두 개 이상의 시퀀스를 하나로 묶어서 튜플로 반환
# zip은 제너레이터를 반환하므로 출력 시 list(zip(x,y))형태로 사용
x = [1,2,3,4,5]
y = [a,b,c,d]
z = [ㄱ,ㄴ]
# zip 개별 접근 및 튜플 반환 확인
d = list(zip(x,y))
print(d)
= [(1,a), (2,b), (3,c), (4,d)]
d[0]
= (1,a)
d[0][0]
= 1
d[0][0]
# 하나 묶기
list(zip(x))
= [(1,), (2,), (3,), (4,)]
# 3개 묶기
list(zip(x,y,z))
= [(1,a,ㄱ), (2,b,ㄴ)]
# ---------------------------------------
# 아스테리스크(*) : 시퀀스 언패킹 연산자
fruit = [apple, tomato, banana]
*fruit = apple, tomato, banana
# 앞의 파라미터 갯수만큼 넣고 나머지는 언패킹하여 b에 넣음
a, b, *c = [1,2,3,4]
print(a)
= 1
print(b)
= 2
print(c)
= [3,4]
# 아스테리스크 2개(**)는 사전(Dictionary)과 같은 키/값 페어 연산에서 사용
info = {'year' : 2014, 'month' : 12, 'day' : 25}
newInfo1 = {'year' : 2021, **info}
newInfo2 = {**info, 'month' : 1, 'day' : 25}
파싱 라이브러리 BeautifulSoup4(bs4)
아래 코드는 크롤링한 데이터를 Python파일와 같은 위치에 result.json을 만들어 저장하는 예제.(이준범님 코드)
내가 직접 만든 크롤러는 NewsCralwer를 참고하자.
여러 특성(제목, 날짜, 키워드분류 등)에 대한 분류가 가능하다.
# parser.py
import requests
from bs4 import BeautifulSoup
import json
import os
# python파일의 위치
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
req = requests.get('https://beomi.github.io/beomi.github.io_old/')
html = req.text
soup = BeautifulSoup(html, 'html.parser')
my_titles = soup.select(
'h3 > a'
)
data = {}
for title in my_titles:
data[title.text] = title.get('href')
with open(os.path.join(BASE_DIR, 'result.json'), 'w+') as json_file:
json.dump(data, json_file)
참고자료
'How-to' 카테고리의 다른 글
몰래보는 VS Code 단축키 정리 (0) | 2023.01.18 |
---|---|
몰래보는 인텔리제이(IntelliJ) 단축키 정리 (0) | 2023.01.18 |
몰래보는 SQL Query 코드조각 (0) | 2023.01.18 |
몰래보는 자바(Java) 코드조각 (0) | 2023.01.18 |
마크다운(Markdown) 작성법 정리 (0) | 2023.01.18 |