详解Python3中字符串中的数字提取⽅法
逛到⼀个有意思的博客在⾥⾯看到⼀篇关于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 进⾏替换。如果没有到匹配 pattern 的串,则返回未被修改的 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)字符串截取右3位
>>> 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()的第⼀个参数是分隔符,如果什么都不填就是默认是以空格来分隔。
第⼀种⽅法需要⽤到正则表达式,第⼆种⽅法则需要有分隔符(我猜是不是这个原因,在原⽹页上总答案数的数字后有个空格存在)。这两种⽅法都有点局限性,不知道是否有更好的⽅法来分离字符串中的数字。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论