Pythonの基礎(1行で書くif文・文字列検索)

Pythonの基礎的なことを調べているなかで、
簡潔に書ける方法を学んだので忘れないように書き残しておきます。






if文を1行で書く



下記の処理をする関数を作成するとします。




  • 文頭の1文字を大文字に変換する


  • 文末がピリオドで終了していなかった場合にピリオドを付与する





ピリオドで終了していなかった場合にピリオドを付与する処理を、
単純にif文で書いてみました。




def correct_sentence(text: str) -> str:
if text.endswith('.'):
return text.capitalize()

else:
return text.capitalize() + '.'





capitalize() は先頭の1文字を大文字にして、他を小文字に変換するメソッドです。

endswith(検索する文字列) で文字列の末尾を調べることができます。

endswith(検索する文字列, 開始位置, 終了位置) とすることで、
開始と終了の位置を指定することもできます。





この処理を1文で書くことができます。

text.endswith('.') がTrueだった場合に空文字''を付与しています。

if文の条件がTrueだった場合の処理は、if文の前に書くようです。




def correct_sentence(text: str) -> str:
return text.capitalize() + ('' if text.endswith('.') else '.')






正規表現を使った文字列検索



下記の処理をする関数を作成するとします。




  • 半角スペースまたはカンマ、ピリオドで区切った単語を抽出する


  • 文字列に記号が含まれていた場合は、記号を削除して文字列を抽出する





例えば「Hello python!」は「Hello」、「...bye bye」は「bye」が返却されます。





split()を使ったりmatch()を使って書いてみました。




import re


def first_word(text: str) -> str:
# 文字列を半角スペース、またはカンマ、ドットで分割
list = re.split(r'[.,\s]', text)

for value in list:
# 半角英字の単語を返却
if isalpha(value) :
return value


def isalpha(st):
# 文字列の先頭が半角英字か判定
reg = re.compile(r'^[a-zA-Z0-9]+$')
return reg.match(st[0:1])





strip()は引数なしだと文字列の先頭や末尾の余分な空白を削除してくれて、
空白以外を削除したい場合は、引数に削除したい文字列を指定します。(文字列でも正規表現でもどちらでも可能です)

ちなみにここでは使っていませんが、for文でenumerate()を使ってfor index, value in enumerate(list):のように書くと、
インデックスと要素を同時に取得することができます。
また、zip()を使うと2つのリストを同時にループさせることができるようです。





compile()を使うと、正規表現を使って指定したパターンにマッチしているか判定することができます。

引数にパターンを指定する際、rを付けることによって文字列中のバックスラッシュをそのままバックスラッシュとして扱えるようになります。





よく使われる正規表現を忘れないように書いておきます。




# 半角記号
re.compile(r'^[!-/:-@[-`{-~]+$')

# 半角英数字
re.compile(r'^[a-zA-Z0-9]+$')





ごたごた処理を書きましたが、実は1行だけで書くことができます。




import re


def first_word(text: str) -> str:
return re.search("([\w']+)", text).group()





\wは任意の英数文字、+は 直前の文字1回以上の繰り返しです。

search(パターン, 検索対象の文字列) とすることで、マッチしている部分を探すことができます。マッチしなかった場合はNoneを返却します。

似た処理にmatch()もありますが、match()は文字列の先頭から一致するかをチェックするため、
一致するパターンがあってもその前に余分な文字列があった場合は、falseの判定結果になってしまいます。
search()はマッチする部分を探してチェックするため、先頭になくても判定してくれます。
ただし、マッチする箇所が複数あっても最初の文字列しか判定してくれません。

findall()はマッチする部分を全てリストとして返却してくれます。
group()でマッチした文字列を返却してくれます。






所感



今までPythonでコードを書くときは、行き当たりばったりで調べて書いていましたが、
良い感じに変換してくれるメソッドが用意されてたり、
省略して書ける方法を知ることができたので、しっかり覚えて今後に活用していきたいと思います。

良い感じにしてくれるメソッドは知っていないといざというときに使えないので、
他の人の良いコードを見たりして勉強していきたいと思います。