区切り文字で区切られた文字列からの部分文字列の取り出し
テキストファイルのデータは文字列の集まりとして読み込まれる。各文字列は、区切り文字で区切られた複数の項目を含むのが普通である。文字列から区切り文字で区切られた部分文字列を取り出すクラス型CSplitを次のように用意した。
============== splitstring.py =========================
class CSplit:
"""
Split a string by separators
"""
def __init__(self, *seps):
"""
Set separators in the parameter *seps
"""
self.separators = {' '}
#
Default separator
if
len(seps) > 0:
# The
separators are given
self.separators = set()
for v in seps:
self.separators |= {v}
def set_string(self, s):
"""
Set the string s to be splitted
"""
self.words = []
if
len(s) > 0:
spos = -1
epos = 0
while True:
while not(s[epos] in self.separators):
epos += 1
if epos >= len(s):
break
self.words.append(s[spos + 1: epos])
spos = epos
epos = spos + 1
if spos == len(s) - 1:
self.words.append("")
break
if spos >= len(s):
break
self.nonempty_words = []
# Select non empty
substrings
for
w in self.words:
if w != "":
self.nonempty_words.append(w)
def seek(self, pos):
"""
Return
the pos-th substring
"""
if
pos >= len(self.words):
return ""
else:
return self.words[pos]
def seek_nonempty(self,
pos):
"""
Return the pos-th non empty substring
"""
if
pos >= len(self.nonempty_words):
return ""
else:
return self.nonempty_words[pos]
===============================================
区切り文字は、オブジェクトの生成時にパラメータとしてコンマ , で区切って設定する(次のプログラム例check.py参照)。区切り文字を指定しないときは、空白文字が区切り文字として設定される。
処理対象の文字列は、メソッドset_stringの実引数として渡すと、区切り文字で文字列が分割される。分割された文字列からpos番目の部分文字列の取り出しは、関数seekあるいはseek_nonemptyの呼び出しで行うことができる。区切り文字が連続しているときは、その間に空の文字列があると見なされるが、関数seek_nonemptyの場合はこれらの連続する区切り文字で挟まれた空の文字列を無視して処理される。posの値が大きすぎて対応する部分文字列が存在しないときは、空の文字列””が返される。
上のクラスCSplit型の使用例を以下のスクリプトに示す。これらのプログラムファイルは、圧縮ファイルprgs.zipにまとめたので、ダウンロードして使用することができる。
================ check.py ==========================
from splitstring
import *
data = ["",
"1 2 3",
" a bc def",
" 1,2,3 ",
" a, bc def "]
MySplit = CSplit()
for str in data:
print("string:
<{}>".format(str))
MySplit.set_string(str)
for i in
range(len(MySplit.words)):
print("{0}: {1:<5}/{2:5}".format(i, MySplit.seek(i),
MySplit.seek_nonempty(i)))
MySplit1 = CSplit(',')
for str in data:
print("string:
<{}>".format(str))
MySplit1.set_string(str)
for i in
range(len(MySplit1.words)):
print("{0}: {1:<5}/{2:5}".format(i, MySplit1.seek(i),
MySplit1.seek_nonempty(i)))
MySplit2 = CSplit(',',
' ')
for str in data:
print("string:
<{}>".format(str))
MySplit2.set_string(str)
for i in
range(len(MySplit2.words)):
print("{0}: {1:<5}/{2:5}".format(i, MySplit2.seek(i),
MySplit2.seek_nonempty(i)))
================================================
実行例は以下のようになる。
Python 3.6.1
(v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type
"copyright", "credits" or "license()" for more
information.
>>>
============ RESTART:
D:\yasuharu\www\LaCoocan\Python\sampleprgs\SplitString\check.py ============
string: <>
string: <1 2 3>
0: 1 /1
1: 2 /2
2: 3 /3
string: < a bc def>
0: /a
1: /bc
2: /def
3: a /
4: bc /
5: def /
string: < 1,2,3 >
0: /1,2,3
1: /
2: /
3: 1,2,3/
4: /
5: /
string: < a, bc def >
0: /a,
1: /bc
2: /def
3: a, /
4: bc /
5: /
6: /
7: def /
8: /
9: /
string: <>
string: <1 2 3>
0: 1 2 3/1 2 3
string: < a bc def>
0: a bc def/ a bc def
string: < 1,2,3 >
0: 1 / 1
1: 2 /2
2: 3 /3
string: < a, bc def >
0: a / a
1: bc def / bc def
string: <>
string: <1 2 3>
0: 1 /1
1: 2 /2
2: 3 /3
string: < a bc def>
0: /a
1: /bc
2: /def
3: a /
4: bc /
5: def /
string: < 1,2,3 >
0: /1
1: /2
2: /3
3: 1 /
4: 2 /
5: 3 /
6: /
7: /
string: < a, bc def >
0: /a
1: /bc
2: /def
3: a /
4: /
5: bc /
6: /
7: /
8: def /
9: /
10: /
>>>