我试图创建一个匹配所有数字的脚本,包括任何带有前导$(例如$ 12),尾随%(例如12%),内部小数(例如1.24550)的数字,或者内部的逗号(例如1,250,000),或者介于两者之间的空格(例如$ 12,500 1234)
当我尝试将所有这些组合成一行时,我无法使其正常工作。一个问题是它不断抓取字母/单词和不必要的空白区域。我尝试用不同的锚来试验,但不成功,作为解决字母/空白问题的一种方法。我想出了这个:
$oldtime = strtotime(mysqli_fetch_array($savedTime)[0]);
这适用于大多数输入,但是,它不会使用以下输入:
^\$?\.?\d+\.?\,?\d+\.?\,?\%?\s?\d+$
它只是完全跳过这些数字。如果我删除锚点,那么它将匹配数字,但也会占用一堆空格,所以我不知道该怎么做。
答案 0 :(得分:1)
您可以使用正则表达式:
\$?(?:\d[ ,.]?)+%?
\$?
零或一?
(?:\d[ ,.]?)+
匹配一个或多个数字,后跟零或一个空格,逗号,点
%?
匹配零个或一个%
修改强>
仅获取字:
(?:^|\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'
和$
的不一致处理(因为我看起来不够努力),但这种行为已经存在于你的正则表达式中。