📋
Python3 文字列処理 チートシート
Perl を使ってました。個人的にはわかりやすくて大好きなのですが・・・
Perl 使っているとなんでって言われるので、Pythonに切り替えます。
やりたいこと
Perlの自分の定番(勘で書いているので動かないかもしれません)
これをPythonで調べずに書けるようになりたい。
このページだけでやりたいことができる情報を揃えておきたい。
# ReadFileとWriteFileは自作関数
my @data0 = ReadFile("a.txt");
my @data = editfunc(@data0);
WriteFile("b.txt", @data);
# 数字3つをXXXに置換する
sub editfunc(@){
my @d = @_;
my @out =();
foreach my $ln (@d){ # ★ ループ
if($ln =~ /^(.*?)(\d{3})(.*?)$/){ # ★ 正規表現マッチ
$ln = $1."XXX".$3;
}
push(@out,$ln);
}
return @out;
}
ファイル入出力
基本的には、行ごとの配列で扱うようにします。
# 読み込み
fname = 'data.txt'
with open(fname,'r',encoding='utf-8') as f:
atxt = f.read().splitlines()
for t in atxt:
print(t)
# 書き込み
ofile = "out.txt"
d = "\n".join(atxt)
with open(ofile, 'w',encoding='utf-8') as f:
f.write(d)
これ以降は、行ごとの配列になっているものとして
ループ
とりあえずこれくらいあれば。(enumerate は便利ですが覚えてられないので除外します。)
for t in atxt:
print(t)
for i in range(len(atxt)):
print(i,atxt[i])
(Pythonは、continue と break ですね。)
正規表現
これが肝。Perlと違って戸惑いますが、これがあれば。
最強の findall
まずはこれに慣れておく。Perl の =~ と $1 はカバーできる。
import re
pat = r'(\d{6})' #数字が6文字連続だけ抽出
for t in atxt:
res = re.findall(pat,t)
if(res):
print(res[0],t)
置換
Perlの $word =~ s/pen/book/; パターン
newtxt = re.sub(pat,"new",t)
print(newtxt)
とりあえず、引数と出力で同じ変数を指定したら更新してくれるので、
以下でまとめて対応も可能である。
t = "<&&>"
t = re.sub("&", "&",t)
t = re.sub("<", "<",t)
t = re.sub(">", ">",t)
print(t) # <&&>
以下のように書くと、re が不要になる。好みで。
new_text = text.replace("&", "&")
配列操作
appendとpopを忘れない。(もしかしたら、insertとpopだけになるかも。)
- append:リストの末尾に追加。pushと同じで良く使う
- insert:あんまり使わない、すごく万能。第1引数で位置指定。
- pop:空白で末尾を取り出す。0で先頭を取り出す、shift。
おわりに
python は Windows でも簡単に使えるので、
pythonができた方が良いと思い、慣れておきたい。
エラーで怒られたらその都度対応する、慣れていく。
Perlは好きだけど、Windowsでは厳しいし、テキスト処理専用。
Powershellはなるべくやりたくない。
Discussion