首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当与re.findall一起使用时,Python返回匹配的一部分

当与re.findall一起使用时,Python返回匹配的一部分
EN

Stack Overflow用户
提问于 2015-08-19 20:53:12
回答 1查看 578关注 0票数 5

我一直在自学Python,目前正在学习正则表达式。我一直使用的教学文本似乎是为了教授Perl或其他不是Python的语言,所以我不得不稍微修改一下表达式,以适应Python。然而,我并不是很有经验,而且我在想要表达自己的观点时遇到了困难。

这个问题涉及到在文本中搜索价格的例子,要么用小数表示,$500,要么用小数表示,$500.10。

这就是案文所建议的:

代码语言:javascript
运行
复制
\$[0-9]+(\.[0-9][0-9])?

在复制文本时,我使用以下代码:

代码语言:javascript
运行
复制
import re

inputstring = "$500.01"

result = re.findall( r'\$[0-9]+(\.[0-9][0-9])?', inputstring)

if result:
    print(result)
else:
    print("No match.")

然而,其结果不是500.01美元,而是:

代码语言:javascript
运行
复制
.01

我觉得这很奇怪。如果去掉括号和可选小数部分,它就能正常工作。因此,使用这个:

代码语言:javascript
运行
复制
\$[0-9]+\.[0-9][0-9]

我得到:

代码语言:javascript
运行
复制
$500.01

如何使正则表达式返回带小数部分和不带小数部分的值?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 20:55:03

使用非捕获组:

代码语言:javascript
运行
复制
result = re.findall( r'\$[0-9]+(?:\.[0-9][0-9])?', inputstring)
                                ^^ 

如果模式中有任何定义,则re.findall函数返回捕获文本的列表,并且您的模式中有一个文本。你需要通过把它变成非捕获的东西来摆脱它。

re.findall(模式,字符串,flags=0) 如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,则这将是一个元组列表。

更新

您可以通过使用限制量词{2}来稍微缩短正则表达式,该限定符要求前面的子模式恰好出现两次:

代码语言:javascript
运行
复制
r'\$[0-9]+(?:\.[0-9]{2})?'
                    ^^^

甚至将[0-9]替换为\d

代码语言:javascript
运行
复制
r'\$\d+(?:\.\d{2})?'
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32105484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档