Python3提取字符串中数字的两种实用方法解析
本文详解Python3中提取字符串内数字的两种常用方法。首先解析利用re.sub配合正则表达式\D替换非数字字符的实现原理及代码示例;其次探讨通过split()按空格分隔并取首元素的方式处理特定格式数据。对比两者适用场景与局限性,为处理爬虫数据或格式化文本提供清晰的技术参考。
在浏览技术博客时,看到一篇关于解决 ValueError: invalid literal for int() with base 10 错误的文章。博主提出的解决方案是运用 re.sub 方法。
totalCount = '100abc'
totalCount = re.sub("\D", "", totalCount)
但该文章未深入解释其具体含义,因此查阅相关资料并整理记录如下:
查阅 Python3.5.2 官方文档中关于 re 模块 sub 函数的定义,其核心逻辑如下:
re.sub(pattern, repl, string, count=0, flags=0)
该函数会在字符串 string 中查找所有匹配正则表达式 pattern 的子串,并使用另一个字符串 repl 进行替换。若未找到匹配项,则直接返回原始未修改的 string。参数 repl 既可以是字符串,也可以是函数。
基于上述定义,可以分析前文示例语句的含义:在字符串 '100abc' 中,利用正则表达式中的 '\D'(代表非数字字符)匹配所有非数字部分,并将其替换为空字符串 ""。最终返回的结果即为仅包含数字的字符串。
>>> totalCount = '100abc'
>>> totalCount = re.sub("\D", "", totalCount)
>>> print(totalCount)
100
>>> type(totalCount)
<class 'str'>
上述原理说明完毕。此外,笔者在爬取知乎关注的问答内容时,也遇到了类似的数据处理问题:
answer_num_get = soup.find('h3', {'id': 'zh-question-answer-num'}) # 答案数量:32 个回答
if answer_num_get is not None:
answer_num = int(answer_num_get.split()[0])
n = answer_num // 10
代码中的第三行之所以能成功使用 int() 转换,是因为 string.split()[0] 将变量 answer_num_get 的值 "32 个回答" 中的数字部分提取出来(注:"32" 后方存在一个空格,这一细节至关重要,因为从知乎抓取回来的该元素确实包含此空格)。
这里涉及 split() 方法的定义:str.split(sep=None, maxsplit=-1)。
>>> import string
>>> a = "32 个答案"
>>> b = a.split()[0]
>>> print(b)
32
>>> type(b)
<class 'str'>
>>> c = '1,2,3'
>>> c.split(',')
['1', '2', '3']
>>> c.split(',')[0]
'1'
>>> c.split(',')[1]
'2'
>>>
由此可见,split() 的第一个参数用于指定分隔符。若不提供任何参数,则默认以空格作为分隔符进行切割。
第一种方法依赖正则表达式,而第二种方法则需要数据中包含明确的分隔符(推测原网页总答案数数字后存在空格是此方法生效的原因)。这两种方法均存在一定的局限性,目前尚不清楚是否有更优的字符串数字分离方案。
以上即为本文的全部内容,希望对各位的学习有所帮助,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









