Python 中的 sscanf() 功能

该函数sscanf() ,来自编程语言C和C++。虽然Python没有为这个方法提供任何确切的等价方法或库,但可能有其他方法来执行这个功能。

这篇Python文章将使你更好地了解sscanf() ,以及我们如何在Python脚本中模仿它。

Python中的sscanf() 功能

sscanf() 方法从一个已经提供的字符串中提取一个字符串。我们是这样声明这个方法的:

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

这个方法基本上将从一个字符串中读取格式化的输入,与scanf() 不同的是,sscanf() 的数据是从一个字符串中读取,而不是从一个控制台中读取。数据从缓冲区中读取,并进入方法声明中作为参数提供的位置地址。

提供的每个参数都指向一个与格式字符串类型相同的变量。该方法返回成功转换和分配的值。

在Python本身中没有直接对应的库或模块用于sscanf() 。然而,有两种方法可以模仿该功能。

使用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 的库是regex ,它是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 库(不是来自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 testn", "%s", string)
print(string[0])
hoc.sscanf("This is a testn", "%[^n]", string)
print(string[0])
hoc.sscanf("This is a testn", "%*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特有的方式解析字符串。

reregex 库就是这个语言浩瀚的例子。

我们希望你认为这篇文章对理解Python中使用的sscanf() 函数的基本概念有帮助。