Juliaでの文字列操作 – Pythonと比較 –

技術
この記事は約10分で読めます。

はじめに

 次の記事に触発されて書きました。

 Juliaが含まれていません!
 ならばということで、以下、Pythonとの比較の形でまとめておきます。内容は上記記事に準拠しますが、せっかくなので全角文字列の場合も記してみます。

文字列の長さを取得

Python(len)
s = "ABCDE FGHIJ"  # 半角空白
i = len(s)
print(i)
# 結果 11
s = "あいうえお かきくけこ"  # 全角空白
i = len(s)
print(i)
# 結果 11
Julia(length)
s = "ABCDE FGHIJ"  # 半角空白
i = length(s)
println(i)
# 結果 11
s = "あいうえお かきくけこ"  # 全角空白
i = length(s)
println(i)
# 結果 11

文字列から指定文字数の文字を取得

Python([:])※開始は0, 文字位置指定
s = "ABCDE FGHIJ"
x = s[3:]
print(x)
# 結果 "DE FGHIJ"
x = s[3:7]
print(x)
# 結果 "DE F"
s = "あいうえお かきくけこ"
x = s[3:]
println(x)
# 結果 "えお かきくけこ"
x = s[3:7]
println(x)
# 結果 "えお か"
Julia([:])※開始は1, バイト位置指定
s = "ABCDE FGHIJ"
x = s[4:end]
println(x)

# 結果 "DE FGHIJ"
x = s[4:7]
println(x)
# 結果 "DE F"
s = "あいうえお かきくけこ"
x = s[10:end]
println(x)

# 結果 "えお かきくけこ"
x = s[10:19]
println(x)
# 結果 "えお か"

※多バイト文字(日本語全角文字など)での有効なインデックスは、firstindex、nextind、lastindexを用いて得ることができます。
 例えば次のような関数 getindex() を定義することで、文字でのインデックス指定をバイトのインデックスに変換できます。これによって、バイト位置を明示的に意識することなく文字列を取得できます。

# 文字インデックスをバイトインデックスに変換
function getindex(s, charindex)
    byteindex = firstindex(s)
    for i in 2:charindex
        byteindex = nextind(s, byteindex)
    end
    byteindex
end

s = "あいうえお かきくけこ"
startindex = getindex(s, 4)
endindex = getindex(s, 7)
x = s[startindex:endindex]
println(x)
# 結果 "えお か"

 以下、この getindex関数が定義されているものとします。

文字列から左側の指定文字数の文字を取得

Python([:])※開始は0, 文字位置指定
s = "ABCDE FGHIJ"
x = s[:3]
print(x)
# 結果 "ABC"
s = "あいうえお かきくけこ"
x = s[:3]
print(x)
# 結果 "あいう"
Julia([:])※開始は1, バイト位置指定
s = "ABCDE FGHIJ"
x = s[1:3]
println(x)
# 結果 "ABC"
s = "あいうえお かきくけこ"
index = getindex(s, 3)
x = s[1:index]
println(x)
# 結果 "あいう"

文字列から右側の指定文字数の文字を取得

Python([:])※開始は0, マイナスの文字数指定
s = "ABCDE FGHIJ"
x = s[-3:]
print(x)
# 結果 "HIJ"
s = "あいうえお かきくけこ"
x = s[-3:]
print(x)
# 結果 "くけこ"
Julia([:])※開始は1, バイト位置指定
s = "ABCDE FGHIJ"
x = s[length(s)-3+1:end]
println(x)
# 結果 "HIJ"
s = "あいうえお かきくけこ"
index = getindex(length(s)-3+1)
x = s[index:end]
println(x)
# 結果 "くけこ"

文字列から指定文字を検索

Python(find)※開始は0
s = "ABCDE FGHIJ"
i = s.find("DE")
print(i)
# 結果 3
s = "あいうえお かきくけこ"
i = s.find("えお")
print(i)
# 結果 3
Julia(findfirst)※開始は1、バイト位置
s = "ABCDE FGHIJ"
i = findfirst("DE", s)
println(i)
# 結果 4:5
s = "あいうえお かきくけこ"
i = findfirst("えお", s)
println(i)
# 結果 10:13

文字列の後ろから指定文字を検索

Python(rfind)※開始は0
s = "ABCDE FGHIJDE"
i = s.rfind("DE")
print(i)
# 結果 11
s = "あいうえお かきくけこえお"
i = s.rfind("えお")
print(i)
# 結果 11
Julia(findlast)※開始は1、バイト位置
s = "ABCDE FGHIJDE"
i = findlast("DE", s)
println(i)
# 結果 12:13
s = "あいうえお かきくけこえお"
i = findlast("えお", s)
println(i)
# 結果 34:37

文字列を置換

Python(replace)
s = "ABCDE FGHIJ"
x = s.replace("DE", "YZ")
print(x)
# 結果 "ABCYZ FGHIJ"
s = "あいうえお かきくけこ"
x = s.replace("えお", "わをん")
print(x)
# 結果 "あいうわをん かきくけこ"
Julia(replace)
s = "ABCDE FGHIJ"
x = replace(s, "DE" => "YZ")
println(x)
# 結果 "ABCYZ FGHIJ"
s = "あいうえお かきくけこ"
x = replace(s, "えお" => "わをん")
println(x)
# 結果 "あいうわをん かきくけこ"

アルファベットの小文字を大文字に変換

Python(upper)
s = "abcde fghij"
x = s.upper()
print(x)
# 結果 "ABCDE FGHIJ"
s = "abcde fghij"
x = s.upper()
print(x)
# 結果 "ABCDE FGHIJ"
Julia(uppercase)
s = "abcde fghij"
x = uppercase(s)
println(x)
# 結果 "ABCDE FGHIJ"
s = "abcde fghij"
x = uppercase(s)
println(x)
# 結果 "ABCDE FGHIJ"

アルファベットの大文字を小文字に変換

Python(lower)
s = "ABCDE FGHIJ"
x = s.lower()
print(x)
# 結果 "abcde fghij"
s = "ABCDE FGHIJ"
x = s.lower()
print(x)
# 結果 "abcde fghij"
Julia(lowercase)
s = "ABCDE FGHIJ"
x = lowercase(s)
println(x)
# 結果 "abcde fghij"
s = "ABCDE FGHIJ"
x = lowercase(s)
println(x)
# 結果 "abcde fghij"

両端のスペースを削除

Python(strip)
s = "  ABCDE FGHIJ  "  # 半角空白
x = s.strip()
print(x)
# 結果 "ABCDE FGHIJ"
s = "  ABCDE FGHIJ  "  # 全角空白
x = s.strip()
println(x)
# 結果 "ABCDE FGHIJ"
Julia(strip)
s = "  ABCDE FGHIJ  "  # 半角空白
x = strip(s)
print(x)
# 結果 "ABCDE FGHIJ"
s = "  ABCDE FGHIJ  "  # 全角空白
x = strip(s)
println(x)
# 結果 "ABCDE FGHIJ"

左側のスペースを削除

Python(lstrip)
s = "  ABCDE FGHIJ  "  # 半角空白
x = s.lstrip()
print(x)
# 結果 "ABCDE FGHIJ  "
s = "  ABCDE FGHIJ  "  # 全角空白
x = s.lstrip()
print(x)
# 結果 "ABCDE FGHIJ  "
Julia(lstrip)
s = "  ABCDE FGHIJ  "  # 半角空白
x = lstrip(s)
println(x)
# 結果 "ABCDE FGHIJ  "
s = "  ABCDE FGHIJ  "  # 全角空白
x = lstrip(s)
println(x)
# 結果 "ABCDE FGHIJ  "

右側のスペースを削除

Python(rstrip)
s = "  ABCDE FGHIJ  "  # 半角空白
x = s.rstrip()
print(x)
# 結果 "  ABCDE FGHIJ"
s = "  ABCDE FGHIJ  "  # 全角空白
x = s.rstrip()
print(x)
# 結果 "  ABCDE FGHIJ"
Julia(rstrip)
s = "  ABCDE FGHIJ  "  # 半角空白
x = rstrip(s)
println(x)
# 結果 "  ABCDE FGHIJ"
s = "  ABCDE FGHIJ  "  # 全角空白
x = rstrip(s)
println(x)
# 結果 "  ABCDE FGHIJ"

文字列を数値に変換

Python(int)
s = "01001"
i = int(s)
print(i)
# 結果 1001
s = "01001"
i = int(s)
print(i)
# 結果 1001
Julia
s = "01001"
i = parse(Int,s)
println(i)
# 結果 1001
s = "01001"
i = parse(Int,s)
println(i)
# ArgumentError: invalid base 10 digit '0' in "01001"

文字列を日付に変換

Python(datetime)
import datetime

s = "2022/07/07"
d = datetime.datetime.strptime(s, "%Y/%m/%d")
print(d)
// 結果 2022-07-07 00:00:00
Julia(Date)
using Dates

s = "2022/07/07"
d = Date(s, dateformat"y/m/d")
println(d)
// 結果 2022-07-07

数値を文字列に変換

Python(str)
i = 100
s = str(i)
print(s)
# 結果 "100"
Julia
i = 100
s = string(i)
println(s)
# 結果 "100"

日付を文字列に変換

Python
import datetime

d = datetime.datetime.now()
s = d.strftime('%Y/%m/%d')
print(s)
# 結果 "2022/07/27" 
Julia
using Dates

d = now()
s = Dates.format(d, "yyyymmdd")
println(s)
# 結果 "2022/07/27" 

コメント

タイトルとURLをコピーしました