교육/Python 0309-0313

09. 문자열

배경남 2015. 3. 12. 11:25

Strng 관련 함수


#-*- coding:ms949 -*-

s = 'i like Programming'

print(s.upper())                    #대문자로

print(s.lower())                    #소문자로

print(s.capitalize())               #첫글자만 대문자

print(s.swapcase())                 #대소문자변경

print(s.title())                    #단어의 첫글자만 대문자로

print(s.center(40))                 #길이 40에서 가운데 정렬하여 반환

print(s.isdigit())                  #숫자인가

print(s.isalpha())                  #문자인가

print(s.isalnum())                  #숫자+문자인가


s1 = 'i like Programming like python'

print(s1.count('like'))             #like 가 나온 횟수: 2 / 못찾는 경우 -1 리턴

print(s1.find('like'))              #like 가 처음 나오는 위치의 인덱스: 2

print(s1.find('like',3))            #3번 인덱스부터 like 가 나오는 위치의 인덱스: 19

print(s1.rfind('like'))             #뒤에서부터 like 가 나오는 위치의 인덱스: 19

print(s1.index('like'))             #find와 동일함. 단, 못찾는 경우 ValueError 발생

print(s1.startswith('i'))           #시작이 i로 시작하는지 확인 True 반환

print(s1.endswith('pyth'))          #마지막이 pyth로 끝나는지 확인 False 반환

print(s1.replace('like', 'love'))   #문장의 모든 like가 love로 바뀜

print(s1.split())                   #공백을 기준으로 잘라서 list 형태로 return

print(s1.split(sep=' ', maxsplit=2))#공백을 기준으로 자르되 최고 2번만 자르기.

print(s1.splitlines())              #라인을 기준으로 나눔


s2 = '   my name is kim   '

print(s2.strip())                   #좌우공백제거. 우측 공백제거 rstrip, 좌측 공백제거 lstrip


s3 = '###my name is kim###'

print(s3.strip('#'))                #좌우 '#'제거


myStr = ['aaa','bbb','ccc','ddd']

print('-'.join(myStr))              #주어진 문자를 사용하여 list 결합 aaa-bbb-ccc-ddd



substring - http://stackoverflow.com/questions/663171/is-there-a-way-to-substring-a-string-in-python

>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'
"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"


정규표현식

import re

[플래그][내용]
I, IGNORECATE대, 소문자를 구별하지 않는다
L, LOCATE\w, \W, \b, \B를 현재의 로케일에 영향을 받게 한다
M, MULTILINE^가 문자열의 맨 처음, 각 라인의 맨 처음과 매치 된다
$는 문자열의 맨 끝, 각 라인의 맨 끝과 매치
S, DOTALL.을 줄바꾸기 문자도 포함하여 매치하게 한다
U, UNICODE\w, \W, \b, \B가 유니코드 문자 특성에 의존하게 한다
X, VERBOSE정규식 안의 공백은 무시된다
[메소드][설명]
compile(pattern[, flags])pattern을 컴파일하여 정규식 객체를 반환
match(pattern, string[,flags])string의 시작부분부터 pattern이 존재하는지 검사하여
MatchObject 인스턴스를 반환
search(pattern, string[,flags])string의 전체에 대해서 pattern이 존재하는지 검사하여
MatchObject 인스턴스를 반환
split(pattern, string[, maxplit=0])

pattern을 구분자로 string을 분리하여 리스트로 반환

ex) '[,- ]' 패턴을 주면 , - 공백으로 나눈 리스트 반환

findall(pattern, string[, flags])string에서 pattern을 만족하는 문자열을 리스트로 반환
finditer(pattern, string[, flags])string에서 pattern을 만족하는 문자열을 반복자로 반환
sub(pattern, repl, string[, count=0])string에서 pattern과 일치하는 부분에 대하여
repl로 교체하여 결과 문자열을 반환
subn(pattern, repl, string[, count=0])sub와 동일하나, 결과로(결과문자열, 매칭횟수)를
튜플로 반환
escape(string)영문자 숫자가 아닌 문자들을 백슬래쉬 처리해서 리턴.
(임의의 문자열을 정규식 패턴으로 사용할 경우 유용)
Match객체는 match(), search()의 수행 결과로 생성되며, 검색된 결과를 효율적으로 처리할 수 있는 기능 제공. ◎ Match객체가 지원하는 메소드와 속성
[메소드][속성]
group([group1, ...])

입력받은 인덱스에 해당하는 매칭된 문자열 결과의 부분 집합을 반환합니다.인덱스가 '0'이거나 입력되지 않은 경우 전체 매칭 문자열을 반환합니다.

groups()

매칭된 결과를 튜플 형태로 반환. 

정규표현식에 () 괄호를 사용해 그룹핑 필요

groupdict()이름이 붙여진 매칭 결과를 사전 형태로 반환
start([group])매칭된 결과 문자열의 시작 인덱스를 반환. (인자로 부분 집합의 번호나
명시된 이름이 전달된 경우, 그에 해당하는 시작 인덱스를 반환)
end([group])매칭된 결과 문자열의 종료 인덱스를 반환. (인자로 부분 집합의 번호나
명시된 이름이 전달된 경우, 그에 해당하는 종료 인덱스를 반환)
pos원본 문자열에서 검색을 시작하는 위치입니다.
endpos원본 문자열에서 검색을 종료하는 위치입니다.
lastindex매칭된 결과 집합에서 마지막 인덱스 번호를 반환. (일치된 결과가 없는 경우에는 None을 반환)
lastgroup매칭된 결과 집합에서 마지막으로 일치한 이름을 반환. (정규식의 매칭 조건에 이름이 지정되지 않았거나 일치된 결과가 없는 경우 None 반환)
string매칭의 대상이 되는 원본 문자열입니다.





[ 반복 메타 문자 ]
[메타 문자][의미]
*

0회 이상 반복 ex) a*

+

1회 이상 반복 ex) a+
?0회 or 1회 ex) a?
{m}m회 반복
{m, n}m회부터 n회까지 반복
[ 매칭 메타 문자 ]
[메타 문자][의미]
.줄바꿈 문자를 제외한 모든 문자와 매치됨
^

문자열의 시작과 매치됨 ex) ^문자열

$

문자열의 마지막과 매치됨 ex) 문자열$
[ ]문자 집합 중 한 문자를 의미
|또는(or)를 의미
( )

정규식을 그룹으로 묶음. groups 메소드를 이용해 출력 시 필요

[ 이스케이프 기호 ]
[종류][설명]
\d모든 숫자와 매치됨 [0-9]
\D숫자가 아닌 문자와 매치됨 [^0-9]
\s화이트 스페이스 문자와 매치됨 [ \t\n\r\f\v]
\S화이트 스페이스가 아닌 것(특수문자 포함)과 매치됨 [^ \t\n\r\f\v]
\w숫자 또는 문자와 매치됨 [a-zA-Z0-9_]
\W숫자 또는 문자가 아닌 것과 매치됨 [^a-zA-Z0-9_]
\b단어의 경계를 나타냄. 단어는 영문자 혹은 숫자의 연속 문자열
\B단어의 경계가 아님을 나타냄
\A문자열의 처음에만 일치
\Z문자열의 끝에만 일치
[ 최소 매칭을 위한 정규식 ]
[기회][의미]
*?*와 같으나 문자열을 취소로 매치함

+?

+와 같으나 문자열을 취소로 매치함

???와 같으나 문자열을 최소로 매치함
{m,n}?{m,n}과 같으나 문자열을 최소로 매치함



json 포맷 파싱

import json

json.loads ( "json string")    딕셔너리로 반환

json.dumps                 딕셔너리를 json으로 저장



xml 포팻 파싱

기본 library 사용

import xml.etree.ElementTree as ET

import urllib.request as MYURL


kiaURL = 'http://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=109'

response = MYURL.urlopen(kiaURL)

xmlData = response.read().decode('utf-8')

rss = ET.fromstring(xmlData)


for element in rss.findall("./channel/item/description/body/location/data"):

    print(element.findtext('tmEf'), element.findtext('wf'))



BeautifulSoup library 사용 - http://www.crummy.com/software/BeautifulSoup/

from bs4 import BeautifulSoup

import urllib.request as MYURL


jURL = 'http://rss.joins.com/joins_news_list.xml'

response = MYURL.urlopen(jURL)

soup = BeautifulSoup(response)


for item in soup.findAll('item'):

    print( 'title:', item.title.string )

    print( 'description:', item.description.string )


#BeautifulSoup에서는 속성값은 element[key]로 하면됨