在Python中使用正则表达式捕获任何带前导$、尾随%、或带小数、逗号或空格的数字

在Python中使用正则表达式捕获任何带前导$、尾随%、或带小数、逗号或空格的数字,python,regex,Python,Regex,我正在尝试创建一个匹配所有数字的脚本,包括任何带有前导$(例如$12)、尾随%(例如12%)、小数(例如1.24550)、逗号(例如1250000)或空格(例如$12500 1234)的数字 当我试图把这一切都放在一行,我不能让它正常工作。一个问题是,它不断地抓取字母/单词和不必要的空白。我尝试用不同的锚来解决字母/空白问题,但没有成功。我想到了这个: ^\$?\.?\d+\.?\,?\d+\.?\,?\%?\s?\d+$ 这适用于大多数输入,但不适用于以下输入: asbdf 12234 它

我正在尝试创建一个匹配所有数字的脚本,包括任何带有前导$(例如$12)、尾随%(例如12%)、小数(例如1.24550)、逗号(例如1250000)或空格(例如$12500 1234)的数字

当我试图把这一切都放在一行,我不能让它正常工作。一个问题是,它不断地抓取字母/单词和不必要的空白。我尝试用不同的锚来解决字母/空白问题,但没有成功。我想到了这个:

^\$?\.?\d+\.?\,?\d+\.?\,?\%?\s?\d+$
这适用于大多数输入,但不适用于以下输入:

asbdf 12234

它只是完全跳过了数字。如果我移除锚点,那么它将匹配数字,但也会占用一堆空白,因此我不确定在这里要做什么。

您可以使用正则表达式模式:

\$?(?:\d[ ,.]?)+%?
  • \$?
    零或一

  • (?:\d[,.]?)+
    匹配一个或多个数字后跟零或空格、逗号、点

  • %?
    匹配零或一个
    %


编辑:

仅获取单词:

现在,您可以获取捕获的组1(此处仅一个),例如,使用
re.search

In [10]: re.search(r'(?:^|\s)(\$?(?:\d[ ,.]?)+%?)(?=\s|$)', 'abcd $123%').group(1)
Out[10]: '$123%'


In [11]: re.search(r'(?:^|\s)(\$?(?:\d[ ,.]?)+%?)(?=\s|$)', 'www.learninghowtobuild101.com/greattipspart2').group(1)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-b9a600842ec9> in <module>()
----> 1 re.search(r'(?:^|\s)(\$?(?:\d[ ,.]?)+%?)', r'www.learninghowtobuild101.com/greattipspart2').group(1)

AttributeError: 'NoneType' object has no attribute 'group'
[10]中的
re.search(r'(?:^\s)(\$?(?:\d[,.]?)+%?)(?=\s |$),'abcd$123%')。组(1)
[10]:“$123%”
在[11]中:重新搜索(r'(?:^|\s)(\$(?:\d[,.]?)+%?)(?=\s |$),'www.learninghowtobuild101.com/greattippart2')。组(1)
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
---->1.检索(r'(?:^\s)(\$?(?:\d[,.]?)+%?)”,r'www.learninghowtobuild101.com/greattippart2')。组(1)
AttributeError:“非类型”对象没有属性“组”

您可以使用正则表达式模式:

\$?(?:\d[ ,.]?)+%?
  • \$?
    零或一

  • (?:\d[,.]?)+
    匹配一个或多个数字后跟零或空格、逗号、点

  • %?
    匹配零或一个
    %


编辑:

仅获取单词:

现在,您可以获取捕获的组1(此处仅一个),例如,使用
re.search

In [10]: re.search(r'(?:^|\s)(\$?(?:\d[ ,.]?)+%?)(?=\s|$)', 'abcd $123%').group(1)
Out[10]: '$123%'


In [11]: re.search(r'(?:^|\s)(\$?(?:\d[ ,.]?)+%?)(?=\s|$)', 'www.learninghowtobuild101.com/greattipspart2').group(1)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-11-b9a600842ec9> in <module>()
----> 1 re.search(r'(?:^|\s)(\$?(?:\d[ ,.]?)+%?)', r'www.learninghowtobuild101.com/greattipspart2').group(1)

AttributeError: 'NoneType' object has no attribute 'group'
[10]中的
re.search(r'(?:^\s)(\$?(?:\d[,.]?)+%?)(?=\s |$),'abcd$123%')。组(1)
[10]:“$123%”
在[11]中:重新搜索(r'(?:^|\s)(\$(?:\d[,.]?)+%?)(?=\s |$),'www.learninghowtobuild101.com/greattippart2')。组(1)
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
---->1.检索(r'(?:^\s)(\$?(?:\d[,.]?)+%?)”,r'www.learninghowtobuild101.com/greattippart2')。组(1)
AttributeError:“非类型”对象没有属性“组”

放下锚定并使用
.search()
而不是
.match()


我无法解释对
$
%
的不一致处理(因为我还没有仔细研究),但这种行为已经存在于您的正则表达式中

放下锚并使用
.search()
而不是
.match()


我无法解释对
$
%
的不一致处理(因为我还没有仔细研究),但这种行为已经存在于您的正则表达式中

这真的很好,非常感谢。我遇到的唯一问题是它从URL之类的东西(我想避免)中提取数字。例如,如果我在www.learninghowtobuild101.com/greattippart2上测试它,它也会提取所有这些数字(即101和2)。有办法解决这个问题吗?我尝试了一些替代方案,但不断遇到问题。再次感谢,有没有一种方法可以不分组完成这项工作?我觉得必须有一个简单、直接的方法,不用任何语言就能把所有这些数字都拉进去,我只是不擅长正则表达式,所以我可能遗漏了一些东西。但如果可能的话,我想把所有的东西都放在一组。只是不确定这是否是一个选项。@David分组是必需的,因为
re
模块不支持可变宽度查找,如果需要,请查看
regex
模块。还有,分组有什么问题吗?分组没什么问题,我只是想更好地使用regex,并认为可能有更直接的方法来获取我可能忽略的所有这些不同的数字。我觉得我把事情复杂化了这真的很好,非常感谢。我遇到的唯一问题是它从URL之类的东西(我想避免)中提取数字。例如,如果我在www.learninghowtobuild101.com/greattippart2上测试它,它也会提取所有这些数字(即101和2)。有办法解决这个问题吗?我尝试了一些替代方案,但不断遇到问题。再次感谢,有没有一种方法可以不分组完成这项工作?我觉得必须有一个简单、直接的方法,不用任何语言就能把所有这些数字都拉进去,我只是不擅长正则表达式,所以我可能遗漏了一些东西。但如果可能的话,我想把所有的东西都放在一组。只是不确定这是否是一个选项。@David分组是必需的,因为
re
模块不支持可变宽度查找,如果需要,请查看
regex
模块。还有,分组有什么问题吗?分组没什么问题,我只是想更好地使用regex,并认为可能有更直接的方法来获取我可能忽略的所有这些不同的数字。我有种感觉,我把事情复杂化了