takahiro_itazuriの公倍数的ブログ

本やWebを通して学習したことをまとめるブログです。最大公約数(つまり、共通部分)的なという表現と対比して、「なるべく包括的にカバーしつつ、更に+αの要素も加えられたらいいな」という意味で公倍数的ブログと名付けました。

【就プロ】ブレース展開

はじめに

ブレース展開とは、bashの機能の一つで、(他にも色々あるのですが)簡単に文字列を複数生成するための方法です。

早速ですが、例です。

$ echo a{l,m,n}
al am an

$ echo {l,m}{a,b}
la lb ma mb

上のように共通部分を外に出して書いたり、交差して足したりできるので簡単に書くことができます。

説明

{文字列1,文字列2,...,文字列N}

カンマで区切られた入力文字列をそのままスペース区切りにして出力します。

$ echo {a,b,c}
a b c

<先頭文字列>{.....}

数式の展開のように先頭文字列を中括弧内の頭に付けます。

$ echo a{m,n}
am an

{.....}<末尾文字列>

こちらも先頭と同じように今後は末尾に付けます。

$ echo {m,n}b
mb nb

<先頭文字列>{.....}<末尾文字列>

& echo a{m,n}b
amb anb

実装

Python

# -*- coding: utf-8 -*-

if __name__=="__main__":
    S = input()
    start_pos = S.find("{")
    end_pos = S.find("}")

    top = S[:start_pos]
    inside = S[start_pos + 1:end_pos]
    back = S[end_pos + 1:]

    inside_list = list(inside)
    
    post_pos = 0
    curr_pos = 0
    
    output = ""
    while(True):
        curr_pos = inside.find(",")
        if curr_pos == -1:
            break
        output += (top + inside[post_pos: curr_pos] + back + " ")
        
        inside_list[curr_pos] = "_"
        inside = "".join(inside_list)
        post_pos = curr_pos + 1
        
    output += (top + inside[post_pos:] + back)
    print(output)