Python の sscanf() 機能

Abid Ullah 2023年10月10日
Python の sscanf() 機能

関数 sscanf() は、プログラミング言語 C および C++ からのものです。 Python はこのメソッドとまったく同等のメソッドやライブラリを提供していませんが、この機能を実行する他の方法があるかもしれません。

この Python 記事は、sscanf() が提供するものと、Python スクリプトでそれをどのように模倣できるかをよりよく理解するのに役立ちます。

Python の sscanf() 機能

sscanf() メソッドは、すでに提供されている文字列から文字列を抽出します。 メソッドの宣言方法は次のとおりです。

int sscanf(const char *str, const char *format, ...)

このメソッドは基本的に文字列から書式設定された入力を読み取り、scanf() とは異なり、sscanf() のデータはコンソールではなく文字列から読み取られます。 データはバッファから読み取られ、メソッド宣言で引数として指定されたロケーション アドレスに読み込まれます。

指定されたすべての引数は、フォーマット文字列と同じ型の変数を指します。 このメソッドは、正常に変換されて割り当てられた値を返します。

Python 自体には、sscanf() に直接相当するライブラリやモジュールはありません。 ただし、機能を模倣するには 2つの方法があります。

re ライブラリの正規表現を使用する

正規表現は、文字列の形式を指定したり、文字列の形式を記述したりするのに役立ちます。これを使用して、別の文字列を検証できます。 正規表現には、通常の文字だけでなく特殊文字も含めることができます。

A、B、b、または 0 などの文字は、式の中で最も単純な通常の文字の良い例です。 ライブラリは、特定の順序で文字列または文字のリスト内の特定の文字を検索することもできます。

提供された文字列で文字列 def を検索する以下のスクリプト例を見てください。

コード例:

import re

m = re.search("(?<=abc)def", "abcdef")
m.group(0)

プログラムは出力として def を返します。

特殊文字で区切られた文字列内の文字列を検索することもできます。 たとえば、次のスクリプトでは、ハイフンの後に指定された単語を検索します。

コード例:

m = re.search(r"(?<=-)\w+", "spam-emails")
m.group(0)

この出力は emails です。 re による構文解析の可能性は無限大です!

re に似た別のライブラリは、API フレンドリーな regex です。 正規表現は re と下位互換性があり、追加機能が付属しています。

以下は、regex モジュールで可能になった条件付きパターン テストです。 もちろん、これを実行する前にライブラリをインポートする必要があります。

コード例:

>>> regex.match(r'(?(?=\d)\d+|\w+)', '123abc')
<regex.Match object; span=(0, 3), match='123'>
>>> regex.match(r'(?(?=\d)\d+|\w+)', 'abc123')
<regex.Match object; span=(0, 6), match='abc123'>

Neuron ライブラリを使用する

neuron ライブラリ (Python 自体からではありません) を使用して、Python スクリプトに sscanf() をインポートすることもできます。 たとえば、次のスクリプトを実行するとします。

from neuron import h

x = h.ref(0)
h.sscanf("0.3", "%f", x)
print(x[0])

結果の出力は 0.300000011921 になります。

neuron ライブラリを介して Python で sscanf() を使用する方法を理解するために、さらにいくつかの例を示します。各行に対する出力がコメントとして追加されています。

コード例:

from neuron import h as hoc

string = hoc.ref("")
range_list = [hoc.ref(0) for i in range(50)]
hoc.sscanf("This is a test\n", "%s", string)
print(string[0])
hoc.sscanf("This is a test\n", "%[^\n]", string)
print(string[0])
hoc.sscanf("This is a test\n", "%*s%s", string)
print(string[0])
hoc.sscanf(
    "1 2 3 4 5 6 7 8 9 10",
    "%f%f%f%f%f%f%f%f%f%f%f",
    range_list[0],
    range_list[1],
    range_list[2],
    range_list[3],
    range_list[4],
    range_list[5],
    range_list[6],
    range_list[7],
    range_list[8],
    range_list[9],
    range_list[10],
    range_list[11],
    range_list[12],
)
print("Should only have non-zero values for range_list indices 0 - 9")
for i in range(13):
    print("%d %g" % (i, range_list[i][0]))

上記の両方のオプションからわかるように、シナリオに応じていずれかのライブラリを使用できます。 Python は、大規模で高速に型付けされた美しい言語であり、通常は Python に固有の方法で文字列を解析するための幅広いオプションを提供します。

re および regex ライブラリは、言語の広大さの例です。

この記事が、Python で使用される sscanf() 関数の基本的な概念を理解するのに役立つことを願っています。

著者: Abid Ullah
Abid Ullah avatar Abid Ullah avatar

My name is Abid Ullah, and I am a software engineer. I love writing articles on programming, and my favorite topics are Python, PHP, JavaScript, and Linux. I tend to provide solutions to people in programming problems through my articles. I believe that I can bring a lot to you with my skills, experience, and qualification in technical writing.

LinkedIn