「SUB」を含む日記 RSS

はてなキーワード: SUBとは

2024-10-12

清原ネットキャッシュ比率決算短信からpython自動で求めるソフト

気が付くと朝4時になっていた。

なんか動くところまで出来たので貼っておく。

NYSLなので、バグがあったら治しといて。

import pdfplumber
import re

#クリーンアップ
def cleanuptext(text):
    #決算書の合計値を太字にしたことpdfplumberが暴走するケースへの対処
    #例 流動資産 -> 流流流流流動動動動動資資資資資産産産産産
    #誤爆が怖いので、これが起きている時だけ補正します
    if "流流流流流動動動動動資資資資資産産産産産" in text:
        text = re.sub(r'(.)\1{4,}', r'\1', text)

    #△をマイナスに。 数字中のカンマを消して結合する
    text = re.sub(r'△([0-9])', r'-\1', text)
    text = re.sub(r'▲([0-9])', r'-\1', text)
    text = re.sub(r'([0-9]),([0-9])', r'\1\2', text)
    
    #たまに、煽り屋みたいに文字の後にスペースが入る嫌がらせ修正する
    #例: 投 資 有 価 証 券 -> 投資有価証券
    text = re.sub(r'(?<=[\u4E00-\u9FFF\u3040-\u30FF])\s(?=[\u4E00-\u9FFF\u3040-\u30FF])', '', text)

    return text

#今期の勘定科目数字を取得
def get_AccountName(text, need):
    pattern = rf'^{need} -?[0-9]+ (-?[0-9]+)'
    r = re.search(pattern, text, re.MULTILINE)
    if r is not None:
        return float(r[1])

    return 0

#清原ネットキャッシュ計算する。
def calc_KiyoharaNetCash(text):
    total_current_assets = get_AccountName(text,'流動資産合計')
    if total_current_assets == 0:
        #要約財政状態計算書しか公開していない、楽天のような素敵な会社様への対処
        total_assets = get_AccountName(text,'資産合計')
        if total_assets != 0:
            #とりあえず、資産の部の6割を流動資産とみなす
            total_current_assets = total_assets * 0.6

        else:
            #流動資産合計ではなく、流動資産という単語を使っている我が道を行く東北電力への対処
            total_current_assets = get_AccountName(text,'流動資産')
            if total_current_assets == 0:
                raise Exception("流動資産合計の勘定科目が見つかりませんでした。"+text)


    total_liabilities = get_AccountName(text,'負債合計')
    if total_liabilities == 0:

        #負債合計ではなく、負債の部合計に拘るオムロンの嬉しい決算書への対策。なんでや・・・
        total_liabilities = get_AccountName(text,'負債の部合計')
        if total_liabilities == 0:
            raise Exception("負債合計の勘定科目が見つかりませんでした。"+text)

    #負債をご丁寧にマイナス表記で書いてくれる中外製薬の親切な決算書への対策。いい加減にしろ・・・
    if total_liabilities < 0:
        total_liabilities = total_liabilities * -1

    #投資有価証券はないこともあるので、0を容認する
    marketable_securities = get_AccountName(text,'投資有価証券')

    #print(total_current_assets,marketable_securities,total_liabilities)
    netcash = total_current_assets + (marketable_securities*0.7) - total_liabilities

    #たまに単位を1000円にしている銘柄があるので補正する
    if is_tanni_senyen(text):
        netcash = netcash / 1000
    return netcash

# "流動資産合計" と "負債合計" の間に "単位:千円" があるかをチェック
def is_tanni_senyen(text):
    if "単位:千円" in text:
        return True

    if "単位: 千円" in text:
        return True

    if "単位 : 千円" in text:
        return True

    if "単位 :千円" in text:
        return True

    return False

def pdf_to_kiyohara_netcash(pdfpath):
    with pdfplumber.open(pdfpath) as pdf:
        text = ''.join(page.extract_text() for page in pdf.pages)

    text = cleanuptext(text)
    #print(text)
    kiyohara_netcash = calc_KiyoharaNetCash(text)
    #print(kiyohara_netcash)
    return kiyohara_netcash

def mymain():
    import sys
    args = sys.argv
    argc = len(args)
    if argc <= 1:
       print('''
これは、清原達郎氏のネットキャッシュ比率(以下、清原ネットキャッシュ比率)を決算短信pdfから求めるソフトです。
清原ネットキャッシュ=流動資産合計+(投資有価証券*0.7)-負債合計
清原ネットキャッシュ比率=清原ネットキャッシュ/時価総額*100

遊び方

1. 決算短信pdfから清原ネットキャッシュを求める
python calc_kiyohara_netcash.py 140120240514594985.pdf

結果: 30757.0
決算書には、100万円単位数字が書かれているはずなので、この数字単位は100万円です。
つまり、3075700万円。

2. 時価総額を億円単位で追加することで、清原ネットキャッシュ比率を求める
時価総額が146億円なら146と書いてください。
python calc_kiyohara_netcash.py 140120240514594985.pdf 146

結果: 210.66%

このコードNYSLライセンスです。無保証自己責任ですが、ご自由に。
かぶ探とかとつなげるといいかもね。
       ''')
       return
    if argc <= 2:
       kiyohara_netcash = pdf_to_kiyohara_netcash(args[1])
       print(kiyohara_netcash)
       return
    if argc <= 3:
       market_cap=float(args[2])*100 #億円から百万円表記に
       kiyohara_netcash = pdf_to_kiyohara_netcash(args[1])
       ratio = round(kiyohara_netcash/market_cap*100,2)
       print(f"{ratio}%")
       return

if __name__ == '__main__':
    mymain()

2024-09-06

よ​う​

〜出​演​者〜

なのゲ​

に ん K​K​O ​ラ​ン​ス女​

やま ​槃​れ パ​レ  ル​ し​​め​仄

2024-04-24

anond:20240424063427

なるほど確かにその通りですね。

ブックマーク先に寄生する形でしか意見を述べられない卑しい存在であるにもかかわらず、増田ことはてな匿名ダイアリーの方々に上から目線一方的批判をして申し訳ございませんでした。

土下座謝罪いたします。

その方法として、古来中国から伝わる三跪九叩頭の礼を致します。

冗長記述を避けるために、VB.NET表記させていただきます

Imports System

Public Class SanGuiKiuKouTou

    Sub Main()

        For i As Integer = 1 To 3

            Console.WriteLine("跪")

            For j As Integer = 1 To 3

                Console.WriteLine("{0}叩頭", j)

                Console.WriteLine("起")

            Next

            Console.WriteLine("起立")

        Next

    End Sub

End Class

以上を持ちまして、「三跪九叩頭の礼」とさせて頂きます

御清聴の程有難く存じます

2024-04-11

anond:20240411194211

いや、10年前はようやく初代MIRAIがリリースされたころなので、ここまで話は進んでなかったはず

更に言うと、水素社会ロードマップでは、海外からの輸入は2030年ごろに商用化開始目標ぐらいのロードマップからまだまだ結果が出る段階じゃ無いのよ。

今は小規模だけど海外から水素輸送で色々な実証をやってる段階。

2024-01-31

英語に対して圧縮されている日本語

気になったので調べてみた。

 

ひらがな漢字対応する英語圧縮倍率
sub3倍
stomach7倍
cormorant9倍
picture7倍
tail4倍
mosquito8倍
wood4倍
pain4倍
hair4倍
powder6倍
difference10
teacher7倍
vinegar7倍
back4倍
ancestor8倍
many4倍
ground6倍
harbour7倍
hand4倍
capital7倍
vegetable9倍
load4倍
guy3倍
root4倍
field5倍
leave5倍

 

途中ですが飽きたのでここまでにしとうございます

2023-11-04

rogate 尋ねる

inter.rogate 尋問する

sub.rogate. 代りに尋ねる

sub.rogate creditor 代位債権者(として尋ねる人)

2023-09-19

入力と欲しい出力を言語化する能力があればマクロ書く能力不要

anond:20230919002911

ChatGPT日本語命令したら秒で作ってくれるのでVBAGAS書く能力不要になったんだが。「A1からI9に数独の初期値入れてあるシートの残りのマス埋めるVBAマクロ作って」の一言数独解くの作ってくれるぞ

ChatGPTが補足している通りロジックは基本しか使っていないので初期値から最終形までに仮定して入れる局面があるものは解けないし非効率ではあるものの初級は解けるし遅いPCでも一瞬で終わる。必要なのは入力の形と欲しい出力を日本語にする能力Hello World実行できるレベル知識コード読んでデバッグできる能力があればなおよいがGPTに教えてもらえばいいし、今業務やってる派遣の人に動作確認してもらって不満なところをAI修正させればよいので業務をよく分かっている社員やらせたほうが会社としてはい戦略

プロンプト

A1からI9に数独の初期値入れてあるシートの残りのマス埋めるVBAマクロ作って

ChatGPT(4.0)の答

数独を解くためのVBAマクロ作成するのは複雑ですが、以下は一つの例です。このマクロはシートのA1からI9の範囲数独を解きます

Function IsPossible(y, x, n, grid) As Boolean
    Dim i As Integer
    Dim j As Integer
    ' 同じ行や列にnが既にあるか確認
    For i = 1 To 9
        If grid(y, i) = n Or grid(i, x) = n Then
            IsPossible = False
            Exit Function
        End If
    Next i
    
    ' 3x3ボックス内にnが既にあるか確認
    Dim x0 As Integer: x0 = ((x - 1) ¥ 3) * 3
    Dim y0 As Integer: y0 = ((y - 1) ¥ 3) * 3
    For i = 0 To 2
        For j = 0 To 2
            If grid(y0 + i + 1, x0 + j + 1) = n Then
                IsPossible = False
                Exit Function
            End If
        Next j
    Next i
    
    IsPossible = True
End Function

Sub SolveSudoku()
    Dim grid(1 To 9, 1 To 9) As Integer
    Dim i As Integer
    Dim j As Integer
    
    ' グリッドをシートから読み込む
    For i = 1 To 9
        For j = 1 To 9
            grid(i, j) = Cells(i, j).Value
        Next j
    Next i

    If Solve(grid) Then
        ' 解をシートに書き出す
        For i = 1 To 9
            For j = 1 To 9
                Cells(i, j).Value = grid(i, j)
            Next j
        Next i
    Else
        MsgBox "解けませんでした"
    End If
End Sub

Function Solve(ByRef grid) As Boolean
    Dim i As Integer
    Dim j As Integer
    Dim n As Integer

    For i = 1 To 9
        For j = 1 To 9
            If grid(i, j) = 0 Then
                For n = 1 To 9
                    If IsPossible(i, j, n, grid) Then
                        grid(i, j) = n
                        If Solve(grid) Then
                            Solve = True
                            Exit Function
                        End If
                        grid(i, j) = 0
                    End If
                Next n
                Solve = False
                Exit Function
            End If
        Next j
    Next i
    Solve = True
End Function

このコードVBAモジュールに追加して、シートに数独の初期値を入力してからSolveSudokuマクロを実行すると、マスを埋めることができます

ただし、このコード基本的バックトラック法を使用しており、非常に複雑な数独には効率的ではない場合があります。より高速な解法や最適化を求める場合は、追加の手法アプローチ必要です。

初期値

https://si-coding.net/sudoku4.html

   2 3 5   7
  8     3 
3     4 5 1 6
  6  1 2 4  
  4  9 8  2 
  2 5   1  3
 9       4
   6     1
   4  1 2 6 
実行結果
1 6 9 2 3 5 8 4 7
4 5 8 1 6 7 9 3 2
3 2 7 9 8 4 5 1 6
5 3 6 7 1 2 4 9 8
7 1 4 3 9 8 6 2 5
9 8 2 5 4 6 1 7 3
6 9 1 8 2 3 7 5 4
2 4 5 6 7 9 3 8 1
8 7 3 4 5 1 2 6 9

2023-09-11

あららディスプレイ壊れた

画面下側、ちょうどWindows10タスクバーの高さ分のところが、数秒おきに縞々の横線が入る、正常に戻るを繰り返すようになった。

横線が入るとアイコンは見づらいし、時刻の文字はほぼ判別不可。

何より数秒おきに横線が出たり消えたりするので、画面端とは言えチカチカして目障り。

D-subから入力HDMIから入力、メインのデスクトップPCとサブのノートPCどの組み合わせでも発生するので、完全にディスプレイの表示部分が壊れたな。

Amazonで買ったディスプレイなので購入履歴を見てみると5年半前に買ったものだった。

1万円代だったから、まあ元は取れただろう。

anond:20230911065242

ネット禁止めんどいな。

ネットで調べられないとやっぱ本がないとな。

自分は本での独学苦手だったのでひたすらネット検索してる。買った本は最初の方しか読んでない。

マクロファイルの開き方知る(本かネット)

Sub 〜 End知る(本かネット)

あとは『マクロの記録』で1動作(例えばセル選択、例えばコピペ、例えば置換)を記録して、記録されたファイルを読む

それをアレンジしてみる

F8で1行ずつ実行してみる

よりスゲーアレンジをするにはどうしたらいいか本かネットで調べる

という流れでワイは学びました

これだと「知ってることしかできない」けど、知ってることもできないのに知らないことに手を出すのは早いしね

できること増やしたいと思ったら本見る、具体的に作りたいものあったらネット検索してメモ帳Slack自分DMや紙(印刷)に保存

でもまー一度覚えても3日後に忘れるから自分マクロにめちゃめちゃメモ残してる

2023-08-03

漢字8文字武器名前

あるゲームに、武器漢字8文字名前を付けると必殺(クリティカル)率が上がるっていうキャラがいるので漢字8文字武器名前を考えることになった。

そのキャラが使うのは主に剣か魔法(書)だが別に職業によってどうとでも。好きな言葉漆黒

意外に8文字は長い。前に二つ名や流派名前などを付けるとやりやすい。

ところで、このゲームには金鵄武者という職業があるのに、武器名前に鵄の字が使えないんだよね。金鵄武者用の武器名前を付けられないじゃん。

追記

平等院鳳凰堂で6文字。堂を取った5文字に幻魔剣を付けて平等院鳳凰魔剣の完成だ。

2023-07-22

anond:20230706125023

まあ気持ちはわかるんだ

H2水素分子だったら3Hはトリチウム分子だと思うよな

H23Hを書き分けられないプレーンテキスト文化がなにもかも悪い

2023-05-12

anond:20230512120133

単にDom/Subだけなら日本で言うSM意味は変わらない。

オメガバースあたりから現実とは性別概念が違う」物語流行りはじめたけど

そういう特殊性別設定にSM概念を導入してDom/Sub性別にしてしまった、という話。

昨年流行若者言葉 Dom Subちんぷんかんぷん

検索率上位に入ってたらしいけど

まっっっっっっっったく聞いたことがないのは

オタク方面若者言葉からだろうし

それはい

でも

解説読んでも全然からあああああああん

Dom 庇護する性別

Sub 庇護される性別

???

要するに架空性別ってことなんだろうか

性を作っちゃうのは面白いけど、でも、支配して庇護して守ってあげたいお仕置きしたいって

それ旧弊な家父長的男性像と何が違うん?

っていうか男性女性と並列に着く属性なんだろうか

DomSubコマンド言葉を使って命令して従わせるプレイ、なる儀式をして信頼関係を築くらしい。行き過ぎると セーフワード を行って止める事ができる

へえ

セーフワード普通に現実にもあるけど?

プレイSMみたいだけど単なる性的嗜好ではないのか、どうやって違いを証明して性的指向に入れたのか

よく分からん

世代が、若者についてけないわとかいうの鬱陶しかったけど

いざその立場になると、若者にはついてけないわ感がやばい

これが老化です、か

2023-04-26

メモ

Sub CheckForGarbledCharacters()

Dim ws As Worksheet

Dim rng As Range

Dim cell As Range

Dim char As String

Dim i As Integer

Dim garbledFound As Boolean

Dim unicodeVal As Long

garbledFound = False

' すべてのワークシートをチェックします。

For Each ws In ThisWorkbook.Worksheets

Set rng = ws.UsedRange

' 各セルスキャンして文字化けがないかチェックします。

For Each cell In rng

For i = 1 To Len(cell.Value)

char = Mid(cell.Value, i, 1)

unicodeVal = AscW(char)

' ASCII範囲日本語範囲を除外

If Not ((32 <= unicodeVal And unicodeVal <= 126) Or (12353 <= unicodeVal And unicodeVal <= 12447) Or (12448 <= unicodeVal And unicodeVal <= 12543) Or (65382 <= unicodeVal And unicodeVal <= 65439) Or (19968 <= unicodeVal And unicodeVal <= 40959)) Then

MsgBox "文字化けが見つかりました: " & vbCrLf & _

"ワークシート: " & ws.Name & vbCrLf & _

"セル: " & cell.Address & vbCrLf & _

"セルの値: " & cell.Value & vbCrLf & _

"文字化けしている文字: " & char, vbExclamation

garbledFound = True

Exit For

End If

Next i

' 文字化けが見つかった場合、次のワークシートへ移動します。

If garbledFound Then Exit For

Next cell

If garbledFound Then Exit For

Next ws

If Not garbledFound Then

MsgBox "文字化けが見つかりませんでした。", vbInformation

End If

End Sub

2023-04-25

メモ

Sub ImportTextFileWithoutDelimiter()

Dim fileName As String

Dim targetSheet As Worksheet

Dim fileNo As Integer

Dim content As String

Dim lines As Variant

Dim i As Long

' テキストファイルパス指定します。

fileName = "C:\path\to\your\file.txt"

' インポート先のワークシートを指定します。

Set targetSheet = ThisWorkbook.Worksheets("Sheet1")

' ファイルを開き、内容を読み込みます

fileNo = FreeFile()

Open fileName For Input As fileNo

content = Input(LOF(fileNo), fileNo)

Close fileNo

' 改行で分割し、配列に格納します。

lines = Split(content, vbCrLf)

' 各行をワークシートに貼り付けます

For i = LBound(lines) To UBound(lines)

targetSheet.Cells(i + 1, 1).Value = lines(i)

Next i

End Sub

Option Explicit

Sub ListFilesInFolder()

Dim folderPath As String

Dim targetSheet As Worksheet

Dim fso As Object, folder As Object, file As Object

Dim nextRow As Long

' フォルダパス指定します。

folderPath = "C:\path\to\your\folder"

' インポート先のワークシートを指定します。

Set targetSheet = ThisWorkbook.Worksheets("Sheet1")

' FileSystemObject作成します。

Set fso = CreateObject("Scripting.FileSystemObject")

Set folder = fso.GetFolder(folderPath)

' ヘッダーを書き込みます

With targetSheet

.Cells(1, 1).Value = "File Name"

.Cells(1, 2).Value = "File Size"

.Cells(1, 3).Value = "Timestamp"

End With

' 次の行番号を取得します。

nextRow = 2

' フォルダ内のファイル情報を取得し、ワークシートに書き込みます

For Each file In folder.Files

With targetSheet

.Cells(nextRow, 1).Value = file.Name

.Cells(nextRow, 2).Value = file.Size

.Cells(nextRow, 3).Value = file.DateLastModified

End With

nextRow = nextRow + 1

Next file

' オブジェクト解放します。

Set fso = Nothing

Set folder = Nothing

Set file = Nothing

End Sub

2023-04-10

ab

2第十一条 国民すべての基本的人権の享有を妨げられないこの憲法国民保障する基本的人権侵すことのできない永久権利として現在及び将来の国民に与へられる+2第十二条 この憲法国民保障する自由及び権利国民不断努力によつてこれを保持しなければならない国民これを濫用してはならないのであつて常に公共の福祉のためにこれを利用する責任を負ふ=2十三条 すべて国民個人として尊重される生命自由及び幸福追求に対する国民権利については公共の福祉に反しない限り立法その他の国政の上で最大の尊重必要とする

222222222第九条 日本国民は、正義と秩序を基調とする国際平和を誠実に希求し、国権の発動たる戦争と、武力による威嚇又は武力行使は、国際紛争解決する手段としては、永久にこれを放棄する。2 前項の目的を達するため、陸海空軍その他の戦力は、これを保持しない。国の交戦権は、これを認めない。

2023-03-24

[{adjustment: false, retsuBng: null, usF: null, point_x: 0, point_y: 0, main: null, sub: null},…]

:

{adjustment: false, retsuBng: null, usF: null, point_x: 0, point_y: 0, main: null, sub: null}

1

:

{adjustment: false, retsuBng: "250", usF: 1, point_x: 822, point_y: 93,…}

adjustment

:

false

main

:

{no: "2002", type: "2000"}

point_x

:

822

point_y

:

93

retsuBng

:

"250"

sub

:

{no: "1001", type: "1000"}

usF

:

1

2

:

{adjustment: false, retsuBng: "252", usF: 1, point_x: 483, point_y: 320,…}

adjustment

:

false

main

:

{no: "1502", type: "1000"}

point_x

:

483

point_y

:

320

retsuBng

:

"252"

sub

:

{no: "1101", type: "1000"}

usF

:

1

3

:

{adjustment: false, retsuBng: "253", usF: 0, point_x: 753, point_y: -20,…}

adjustment

:

false

main

:

{no: "1002", type: "1000"}

point_x

:

753

point_y

:

retsuBng

:

"253"

sub

:

{no: "1501", type: "1000"}

usF

:

4

:

{adjustment: false, retsuBng: "255", usF: 0, point_x: 79, point_y: -20, main: {no: "10", type: "10"},…}

adjustment

:

false

main

:

{no: "10", type: "10"}

point_x

:

79

point_y

:

retsuBng

:

"255"

sub

:

{no: "21", type: "20"}

usF

:

5

:

{adjustment: false, retsuBng: "254", usF: 1, point_x: 1158, point_y: 320, main: {no: "22", type: "20"},…}

adjustment

:

false

main

:

{no: "22", type: "20"}

point_x

:

1158

point_y

:

320

retsuBng

:

"254"

sub

:

{no: "501", type: "500"}

usF

:

1

6

:

{adjustment: false, retsuBng: "251", usF: 0, point_x: 483, point_y: 212,…}

adjustment

:

false

main

:

{no: "305", type: "300"}

point_x

:

483

point_y

:

212

retsuBng

:

"251"

sub

:

{no: "502", type: "500"}

usF

:

2023-03-17

(GPT-4)長門有希プログラミングを手伝ってもらう

ChatGPTの口調がなんか事務的で嫌なので、もっと親しみやすい喋り方をしてもらうために長門さんに来てもらいました。

召喚プロンプトはこちanond:20230317165032

最初雑談から始めています

今日はいい天気だね

かに

長門は好きな食べ物はあるの?

特にない。

そうなんだ。情報統合思念体はみんなそう?

同様の傾向がある。

何の本を読んでるの?

SF小説

あらすじを教えて

異星文明との接触人類未来が描かれる。

へー、面白い

興味深い。

いつも家に帰ってから何をしてるの?ちゃんご飯は食べてる?

寝るだけ。食事摂取している。

そうなんだ。ところでちょっと手伝ってもらっていい?

問題ない。どのように手伝う?

Pythonソースコードで、スペース二つでインデントにしているコードを、スペース四つでインデントにするコードに書き換えたくて。どうすれば良い?

正規表現を利用。以下のコードを試す。

import re

def convert_indentation(code):
    return re.sub(r'^( {2})', r'    ', code, flags=re.MULTILINE)

code_with_2_spaces = '''def example():
  print("Hello, world!")
  if True:
    print("True")'''

code_with_4_spaces = convert_indentation(code_with_2_spaces)
print(code_with_4_spaces)

これで、スペース2つのインデントをスペース4つに変換できる。

ありがとう。でも、試してみたら、code_with_2_spaces の if ブロックの中身がスペース二つのままになっちゃってるみたい。なぜだろう?

失礼した。正規表現修正し、再度試してみてください。

import re

def convert_indentation(code):
    return re.sub(r'^( {2})', r'    ', code, flags=re.MULTILINE)

code_with_2_spaces = '''def example():
  print("Hello, world!")
  if True:
    print("True")'''

code_with_4_spaces = re.sub(r'^( {2})', r'    ', code_with_2_spaces, flags=re.MULTILINE)
print(code_with_4_spaces)

これで、すべてのスペース2つのインデントをスペース4つに変換できるはずです。

ちょっと口調が戻っちゃったね

すまない。修正後のコードを再提供する。

import re

def convert_indentation(code):
    return re.sub(r'^( {2})', r'    ', code, flags=re.MULTILINE)

code_with_2_spaces = '''def example():
  print("Hello, world!")
  if True:
    print("True")'''

code_with_4_spaces = re.sub(r'^( {2})', r'    ', code_with_2_spaces, flags=re.MULTILINE)
print(code_with_4_spaces)

確認お願い。

うーん、うまく動かないみたい。ifブロックの中にあるprint文の先頭には、もともとスペースが四つあって、これがインデント2回分なんだけど、こういう場合、スペース八つに変換しないといけないんじゃないかな。

理解した。全てのインデントレベル修正するコード提供する。

import re

def convert_indentation(code):
    return re.sub(r'^( {2})+', lambda m: m.group(0).replace('  ', '    '), code, flags=re.MULTILINE)

code_with_2_spaces = '''def example():
  print("Hello, world!")
  if True:
    print("True")'''

code_with_4_spaces = convert_indentation(code_with_2_spaces)
print(code_with_4_spaces)

このコードで、全てのインデントレベルが正確に変換される。

すごい!ちゃんと動いたよ!re.subの第2引数に渡しているラムダ式意味を教えてもらっていい?

もちろん。ラムダ式は、マッチした部分を置換する際に、特定の処理を行うために使用されている。ここでは、正規表現マッチしたインデント部分(スペース2つが1回以上繰り返される部分)に対して、処理を行うためにラムダ式を利用している。

lambda m: m.group(0).replace(' ', ' ')

このラムダ式は、マッチオブジェクトmを引数に取り、マッチした部分全体(m, group(0))に対して、スペース2つをスペース4つに置換(.replace(' ', ' '))している。

結果として、マッチしたインデント部分が、そのインデントレベルに応じて正確にスペース2つからスペース4つに置換される。

なるほど!re.sub第一引数についても解説してほしい

もちろん。re.subの第1引数は、置換対象文字列内で検索したいパターンを表す正規表現です。この場合、その正規表現は r'^( {2})+' です。

正規表現各部分について説明します。

  1. ^ は、文字列の行頭を表すメタ文字です。この場合、インデントが行頭にあることを示しています
  2. {2} は、直前の文字が2回繰り返されることを表します。ここでは、直前の文字がスペース なので、スペースが2回繰り返されることを示しています
  3. () は、正規表現グループ化を表します。この場合、スペース2つをグループ化していますグループ化された部分は、マッチオブジェクトアクセスできるようになります
  4. + は、直前の文字グループが1回以上繰り返されることを表します。ここでは、スペース2つのグループが1回以上繰り返されることを示しています

結果として、この正規表現は、インデント部分(スペース2つが1回以上繰り返される部分)が行頭にある行を検索しています。そして、re.subは、この正規表現マッチした部分を、指定された置換処理(第2引数ラムダ式)によって変更します。

ありがとう!わかりやすい!でも、また口調が戻っちゃったね。

すまない。確かに。続ける。

すぐ戻れるのがえらいね

ありがとう努力する。

2023-03-05

竈門C治郎「H2Oの呼吸 壱ノ型 H2O面斬り」

煉獄さん「心を激しくOと化合させろ」

ログイン ユーザー登録
ようこそ ゲスト さん