Python を利用した文字列の置換、検索、後方参照

文字列

Python は文字列の結合、切り出し、置換、正規表現による検索や後方参照などをサポートしている。正規表現による検索を行う場合は、re モジュールをインポートする必要がある。

文字列の結合

2 つの文字列の結合して、1 つの文字列にするとき、+ を用いる。

dna_1 = 'AGCTACGTAGTATT'
dna_2 = 'ATGCTAGCAAATATATAAAA'

dna = dna_1 + dna_2

print(dna)
## AGCTACGTAGTATTATGCTAGCAAATATATAAAA

リストの要素を結合して 1 つの文字列のする場合は join メソッドを用いる。その場合、2 つの文字列を結合する場合、どんな文字を利用して結合するのかを指定することができる。

dna = ['AGCTACGTAGTATT', 'ATGCTAGCAAATATATAAAA']

dna_str = "-".join()
print(dna_str)
## AGCTACGTAGTATT-ATGCTAGCAAATATATAAAA

dna_str = "".join()
print(dna_str)
## AGCTACGTAGTATTATGCTAGCAAATATATAAAA

文字列の切り出し

文字列のスライスはインデックスを指定して行う。Python では、1 文字目の文字列の左側が 0 となっている。

dna = 'AAACCCGGGTTT'

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

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

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

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

文字列の置換

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

dna = 'AGACXGTAXCGXTA'

dna_mod = dna.replace('X', 'C')
print(dna_mod)
## 'AGACCGTACCGCTA'


dna_mod = dna.replace('X', "C', 2)
print(dna_mod)
## 'AGACCGTACCGXTA'

高度な文字列置換は、正規表現を利用する。正規表現を利用する場合は、re モジュールをインポートする必要がある。

import re

dna = 'AAAAXAAACCCXCCCAAXAGGGTTTT'
pattern = re.compile("AXA")
dna_mod = pattern.sub('CCC', dna)
print(dna_mod)
## 'AAACCCAACCCXCCCACCCGGGTTTT'


dna = 'AAGCAGTXCXGAGCAGXTXAGXTXA'
pattern = re.compile("X(.)X")
dna_mod = pattern.sub(r"C\1C", dna)
print(dna_mod)
## 'AAGCAGTCCCGAGCAGCTCAGCTCA'

文字列の分割

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

dna = 'ACAGTGTATGCCTGCTATGCAGTCGTA'

arr = dna.split('ATG')

for i in arr:
  print(i)
## ACAGTGT
## CCTGCT
## CAGTCGTA

逆に、リストの各要素を繋げる時に join メソッドを利用する。

dna = 'ACAGTGTATGCCTGCTATGCAGTCGTA'
arr = dna.split('ATG')

dna_str = "-".join(arr)
print(dna_str)
## ACAGTGT-CCTGCT-CAGTCGTA

dna_str = "".join(arr)
print(dna_str)
## ACAGTGTCCTGCTCAGTCGTA

文字列検索

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

#      012345678901234567890123456789012
#           TAC              TAC
dna = 'CATTGTACGTCGCGTAGCCATGTACGTCGCAGT'


s = dna.find('TAC')
print(s)
## 5


e = dna.rfind('TAC')
print(e)
## 22


n = dna.find("XXX")
print(n)
## -1

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

import re

dna = 'CATTGTACGTCGCGTAGCCATGTACGTCGCAGT'

pTXC = re.compile("T.C")

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
while i >= 0:
  m = pTXC.search(dna, i)
  if m:
    print(m.start())
    print(m.end())
    i = m.start() + 1
  else:
    break
## 5
## 8
## 22
## 25

後方参照

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

import re
dna = 'AGCGAGCCCAAGCTATGCTATTTAGCATTTCGATAAGTCGATGCTAAAAATA'

pattern = re.compile("(GCCC.+TAAA)")

m = pattern.search(dna)
if m:
    print(m.group(0))
    print(m.start())
    print(m.end())
## 'GCCCAAGCTATGCTATTTAGCATTTCGATAAGTCGATGCTAAA'
## 5
## 48


pattern = re.compile("GCC(.+)TATTT(.+)TTTC")
m = pattern.search(dna)
if m:
  print(m.group(0))
  print(m.group(1))
## 'GCCCAAGCTATGCTATTTAGCATTTC'
## 'CAAGCTATGC'