在Python中使用Regex捕获带有前导$,尾随%或带小数,逗号或空格的任何数字的任何数字

时间:2017-12-31 22:04:16

标签: python regex

我试图创建一个匹配所有数字的脚本,包括任何带有前导$(例如$ 12),尾随%(例如12%),内部小数(例如1.24550)的数字,或者内部的逗号(例如1,250,000),或者介于两者之间的空格(例如$ 12,500 1234)

当我尝试将所有这些组合成一行时,我无法使其正常工作。一个问题是它不断抓取字母/单词和不必要的空白区域。我尝试用不同的锚来试验,但不成功,作为解决字母/空白问题的一种方法。我想出了这个:

$oldtime = strtotime(mysqli_fetch_array($savedTime)[0]);

这适用于大多数输入,但是,它不会使用以下输入:

^\$?\.?\d+\.?\,?\d+\.?\,?\%?\s?\d+$

它只是完全跳过这些数字。如果我删除锚点,那么它将匹配数字,但也会占用一堆空格,所以我不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式:

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

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

  • %?匹配零个或一个%

Demo

修改

仅获取

(?:^|\s)(\$?(?:\d[ ,.]?)+%?)(?=\s|$)

现在,您可以获取捕获的组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'

答案 1 :(得分:1)

放下锚点并使用WebClient代替.search()

.match()

我无法解释>>> import re >>> my_number_finder = re.compile(r"""\$?\.?\d+\.?\,?\d+\.?\,?\%?\s?\d+""") >>> m = my_number_finder.search("asbdf 12234") >>> m.group() '12234' >>> m = my_number_finder.search("asbdf $12234") >>> m.group() '$12234' >>> m = my_number_finder.search("asbdf 122.34%") >>> m.group() '122.34' >>> m = my_number_finder.search("asbdf 3,122.34%") >>> m.group() '3,122.34' >>> m = my_number_finder.search("asbdf 3,122 112") >>> m.group() '3,122 112' $的不一致处理(因为我看起来不够努力),但这种行为已经存在于你的正则表达式中。