Python3の文字列操作

今回はPython3に置いての簡単な文字列操作について紹介したいと思います．

- [文字列に値を埋め込み](#文字列に値を埋め込み)
- [文字列の結合](#文字列の結合)
- [文字列の分割](#文字列の分割)
- [文字列の切り出し](#文字列の切り出し)
- [文字列の置換](#文字列の置換)
- [文字列の削除](#文字列の削除)
- [文字列の検索](#文字列の検索)
- [文字列比較)](#文字列比較)
- [幅寄せ](#幅寄せ)
- [大文字と小文字の置き換え](#大文字と小文字の置き換え)
- [文字列が特定な文字だけであるか](#文字列が特定な文字だけであるか)
- [文字列の先頭または末尾が特定な文字であるか](#文字列の先頭または末尾が特定な文字であるか)

まず，文字列は「"(ダブルクォーテーション)」もしくは「'(シングルクォーテーション)」で囲んで表現しています．
例えば「Hello World」を表示したい場合(今回はメッセージを変数msgに入れます)は`msg = "Hello World"`と書き換えて表示します．また，メッセージを表示するために`print`を使います．それから文字列の中では特殊文字を使うことができて，いくつかあるのですが「\n」で改行，「\t」がタブになります．

## 文字列に値を埋め込み
埋め込みを大きく分けて2つの方法があります．

まず1つ目の方法ですが，次のmoji_01.pyを見てください．
まず埋め込みたい値を文字列の中で「%」付きで表現していきます．
そのとき，値が入れたい場合は「%s」，浮動小数点数の場合は「%f」，整数の場合は「%d」を使います．
その後に「%」と書いてあげて，埋め込みたい値をこのように書いてあげればOKです．

2つ目の方法は，「%」の部分を {0}，{1} としてあげて，その後に .format(name, score) と書いてあげます．こちらの 0 番目の要素が {0} に， 1 番目の要素が {1} に埋め込まれます．
使用方法は次のプログラムを見てください．

``` moji_01.py
name = "guest"
score = 52.8

# 1つ目の方法
print("name: %s, score: %f" % (name, score))
## => name: guest, score: 52.800000

# 2つ目の方法
print("name: {0}, score: {1}".format(name, score))
# => name: guest, score: 52.8

# 中身省略してもOK，そのときformatの中の順番で代入される
print("name：{}，score：{}".format(name, score))
## => name: guest, score: 52.8

```

## 文字列の結合
2つの文字列の結合して，1つの文字列にするとき，「+」を使います．
joinメソッドとリスト/タプルを使って連結するテクニックもあります．
また，同じ内容を繰り返す場合は*演算子で整数を与えると指定した回数だけリピートした文字列が生成されます．
使用方法は次のプログラムを見てください．

``` moji_02.py
word_1 = "Gu"
word_2 = "est"

# 「+」使用
print(word_1 + word_2) ## => Guest

# 「join」使用
words = ["Hello", "World", "!"]
print(" ".join(words)) ## => Hello World !

# 「*」使用
word_3 = "Hello "
print(word_3 * 3) ## => Hello Hello Hello 
```

## 文字列の分割
指定の文字列に対して，区切り文字で分割したリストを返します．
分割数はオプションで，分割する回数を制限できます．分割数は省略することができます．
splitは左から分割を行うことができます．また，rsplitは右から分割することができます．
使用方法は次のプログラムを見てください．

``` moji_0３.py
phrase = "If you can dream it you can do it"
# 「split」使用 .split(区切り文字, 分割数)
print(phrase.split()) ## => ["If","you","can","dream","it","you","can","do","it"]

word = "HelloWorld"
# 「rsplit」使用 .rsplit(区切り文字, 分割数)
print(word.rsplit("l",1)) ## => ['HelloWor', 'd']
```

## 文字列の切り出し
`文字列オブジェクト[開始インデックス:終了インデックス]`開始インデックスと終了インデックスをコロン(:)でつなげて指定します．
使用方法は次のプログラムを見てください．

``` moji_0４.py
word = "ABCDE"
print(word[1:3]) ## => BC
print(word[2:]) ## => CDE
print(word[:3]) ## => ABC
print(word[:]) ## => ABCDE
```
また，開始インデックスや終了インデックスをマイナス「-」つけることができます．ぜひ試してみて下さい．

## 文字列の置換
`.replace(置換される文字列, 置換する文字列, 置換回数)`を使用すると，指定の文字列を置換することができます．
置換回数はオプションで，置換する回数を指定できます．置換回数を指定しない場合は，全て置換されます．
使用方法は次のプログラムを見てください．

``` moji_05.py
word = "ABCABCABC"
# 指定文字列を置換する
print(word.replace("ABC", "X")) ## => XXX

# 置換回数を1回にして指定文字列を置換する
print(word.replace("ABC", "X", 1)) ## => XABCABC
```

## 文字列の削除
`.strip(削除する文字列)`を使用すると，文字列から特定の文字を削除できます．
stripは両端．他に，lstripは左端，rstripは右端の文字列を削除します．
使用方法は次のプログラムを見てください．

``` moji_06.py
word = "ABCABCA"
# stripで両端の削除
print(word.strip("A")) ## => BCABC

# lstripで左端の削除
print(word.lstrip("A")) ## => BCABCA

# rstripで右端の削除
print(word.rstrip("A")) ## => ABCABC
```

## 文字列の検索
`検索する文字列 in 検索対象の文字列`を使用すると，指定の文字列が含まれているかを調べることができます．
検索対象の文字列の中に，検索する文字列が存在すれば，True．存在しないならば，False．
使用方法は次のプログラムを見てください．

``` moji_07.py
word = "ABCABCA"
# 存在する場合
print("ABC" in word) ## => True

# 存在しない場合
print("E" in word) ## => False
```

上の方法以外は，`.find(検索する文字列, 開始位置, 終了位置)`を使う方法もあります．こちらの方がよく使われます．
findは文字列の左端から検索するのに対し，rfindは文字列の右端から検索します．
こちらの方は，開始位置と終了位置を指定することによって，検索範囲を指定することができます．
使用方法は次のプログラムを見てください．

``` moji_07.py
word = "ABCABCA"
# find
print(word.find("A")) ## => 0
print(word.find("B",2, 6)) ## => 4

# rfind
print(word.rfind("A")) ## => 6
print(word.find("B",2, 6)) ## => 6

# 検索した文字列が見つからない場合
print(word.find("D")) ## => -1
```

## 文字列比較(==演算子とis演算子)
文字列同士の比較に"=="という比較演算子を使用し，左右の文字列が一致する場合はTrue，異なる場合はFalseを返します．
文字列同士が異なる場合にTrueを返したい場合は，"!="という比較演算子を使います．
文字列の比較演算子として"=="の他にis演算子があります．
**※ 文字列が同じ値かどうかを調べる場合は"=="を使い，is演算子は使用しないようにしましょう．**
is演算子の利用が推奨される場面はNoneと比較する場合です．
メリットとして"=="と比べてis演算子の方が比較処理の速度が早いです．

```moji_08.py
word = "abcd"
# 一致する場合
print(word == "abcd") ## => True

# 異なる場合
print(word == "abce") ## => False
```


## 幅寄せ
``` moji_09.py
word = "ABCabc"
# 左寄せ 「.ljust」
print(word.ljust(10)) ## => "ABCabc    "

# 右寄せ 「.rjust」
print(word.rjust(10)) ## => "    ABCabc"

# 中央寄せ 「.center」
print(word.center(10)) ## => "  ABCabc  "

# 0で埋めて左寄せ 「.zfill」
print(word.zfill(10)) ## => "0000ABCabc"
```

## 大文字と小文字の置き換え
``` moji_10.py
word = "ABCabc"
# 全て大文字にする 「.upper」
print(word.upper()) ## => ABCABC

# 全て小文字にする 「.lower」
print(word.lower()) ## => abcabc

# 大文字と小文字を入れ替える 「.swapcase」
print(word.swapcase()) ## => abcABC

# 先頭を大文字、その他を小文字にする 「.capitalize」
print(word.capitalize()) ## => Abcabc
```

## 文字列が特定な文字だけであるか
``` moji_11.py
word = "ABCabc"
# 英数字だけか 「.isalnum」
print(word.isalnum()) ## => True

# 英字だけか 「.isalpha」
print(word.isalpha()) ## => True

# 数字だけか 「.isdigit」
print("123".isdigit()) ## => True
print(word.isdigit()) ## => False

# 空白文字だけか 「.isspace」
print("  \n\t\r".isspace()) ## => True
print(word.isspace()) ## => False
```

## 文字列の先頭または末尾が特定な文字であるか
``` moji_12.py
word = "ABCabc"
# Aで始まるかを調べる
print(word.startswith("A")) ## => True

# Aで終わるかを調べる
print(word.endswith("A")) ## => False
```


## 参考サイト
ひきメモ： [http://d.hatena.ne.jp/yumimue/20071223/1198407682](http://d.hatena.ne.jp/yumimue/20071223/1198407682)