文字列

Python で文字列 x に対して置換や分割などのを行う場合は x.replacex.sub などのように、「.メソッド名(関数名)」の形で行う。

文字列検索

文字列の中に特定の語句を含むかどうかを検索する関数は findrfind がある。find は文字列の先頭から検索するのに対し、rfind は文字列の後尾から検索する。該当語句が見つかった場合、その開始位置が返される。見つからなかった場合、-1 を返す。

#      012345678901234567890123456789012
#           TAC              TAC
dna = 'CATTGTACGTCGCGTAGCCATGTACGTCGCAGT'

# 先頭から TAC を検索
s = dna.find('TAC')
print(s)
## 5

# 後尾から TAC を検索
e = dna.rfind('TAC')
print(e)
## 22

# 見つからなかった場合は -1 を返す
n = dna.find("XXX")
print(n)
## -1

正規表現によるパターン検索が行える。re モジュールを呼び出して行う。

import re

dna = 'CATTGTACGTCGCGTAGCCATGTACGTCGCAGT'

# 正規表現パターンを作成(1番目がA、2番目が任意の一文字、3番目がTとなるパターン)
pTXC = re.compile("T.C")

# 文字列中の最初の TXC のパターンを検索する例
m = pTXC.search(dna, 0)        # ゼロは検索開始位置
if m:
  print (m.start())            # マッチ部分の開始位置
  print (m.end())              # マッチ部分の終了位置

## 出力結果
## 5
## 8

上の例では、最初の一つだけが検索できる。すべてのパターンを検索する場合は、while 文を利用して、検索開始位置をずらしながら行う。

import re
dna = 'CATTGTACGTCGCGTAGCCATGTACGTCGCAGT'
pTXC = re.compile("T.C")

i = 0                          # 検索開始位置(最初は 1 文字目)
while i >= 0:
  m = pTXC.search(dna, i)
  if m:                        # 見つかれば開始位置と終了位置を出力
    print(m.start())
    print(m.end())
    i = m.start() + 1          # 検索開始位置を現在から 1 ずらす
  else:                        # 見つからなければ終了します
    break

## 出力結果
## 5
## 8
## 22
## 25

後方参照

正規表現を利用してパターンマッチングを行い、その後方参照を行う場合は、パターンを作成するときに参照部分を括弧で囲む。

import re
dna = 'AGCGAGCCCAAGCTATGCTATTTAGCATTTCGATAAGTCGATGCTAAAAATA'

# 「GCCC」で開始し、「TAAA」で終了するパターン
pattern = re.compile("(GCCC.+TAAA)")

m = pattern.search(dna)
if m:
    print(m.group(0))    # 括弧内の文字列を出力
    print(m.start())
    print(m.end())
## 'GCCCAAGCTATGCTATTTAGCATTTCGATAAGTCGATGCTAAA'
## 5
## 48



# 「GCC」で開始し、途中に「TATTT」があり、最後に「TTTC」で終了するパターン
pattern = re.compile("GCC(.+)TATTT(.+)TTTC")
m = pattern.search(dna)
if m:
  print(m.group(0))     # GCCとTATTTの間に囲まれた部分文字列(最初の括弧なので0を指定)
  print(m.group(1))     # TATTTとTTTCの間に囲まれた部分文字列(1番目の括弧なので1を指定)
## 'GCCCAAGCTATGCTATTTAGCATTTC'
## 'CAAGCTATGC'

文字列の結合

文字列の結合は + を用いる。

dna_1 = 'AGCTACGTAGTATT'
dna_2 = 'ATGCTAGCAAATATATAAAA'

dna = dna_1 + dna_2

print(dna)
## AGCTACGTAGTATTATGCTAGCAAATATATAAAA

文字列の切り出し

文字列のスライスはインデックスを指定して行う。

dna = 'AAACCCGGGTTT'

print(dna[0:3])
## 'AAA'

print(dna[3:])
## 'CCCGGGTTT'

print(dna[:3])
## 'AAA'

print(dna[-3:])
## 'TTT'

文字列の置換

文字列の置換は replace を用いる。

dna = 'AGACXGTAXCGXTA'

# dna 中のすべての X を C に置換
dna_mod = dna.replace('X', 'C')
print(dna_mod)
## 'AGACCGTACCGCTA'


# dna 中の最初の 2 つの X だけを C に置換
dna_mod = dna.replace('X', "C', 2)
print(dna_mod)
## 'AGACCGTACCGXTA'

高度な文字列置換は、正規表現を利用する。

import re

# AXA を CCC に置換する例
dna = 'AAAAXAAACCCXCCCAAXAGGGTTTT'
pattern = re.compile("AXA")
dna_mod = pattern.sub('CCC', dna)
print(dna_mod)
## 'AAACCCAACCCXCCCACCCGGGTTTT'



# XAX、XCX、XGX、XTX などを CAC、CCC、CGC、CTC に置換する例
dna = 'AAGCAGTXCXGAGCAGXTXAGXTXA'
pattern = re.compile("X(.)X")
dna_mod = pattern.sub(r"C\1C", dna)
print(dna_mod)
## 'AAGCAGTCCCGAGCAGCTCAGCTCA'

文字列の分割

文字列を空白あるいはカンマなどで分割し、リストを作成する時、split を利用する。

dna = 'ACAGTGTATGCCTGCTATGCAGTCGTA'

# ATGで文字列を分割してリストに代入
arr = dna.split('ATG')

# リストの内容を表示します
for i in arr:
  print(i)
## ACAGTGT
## CCTGCT
## CAGTCGTA