我试图捕捉在一条线上的美元金额:
例如: blah blah blah (blah $23.32 blah) blah blac (blah)
我想捕捉“$ 23.32”
这是我使用的是什么:r'?([\$][.*]+)'
我告诉它找到(...)的一个发生? 然后我告诉它找到一些以“$”开头的字符和任何可能出现的字符(所以我也可以得到小数点)。
不过,我得到的error: nothing to repeat
我试图捕捉在一条线上的美元金额:
例如: blah blah blah (blah $23.32 blah) blah blac (blah)
我想捕捉“$ 23.32”
这是我使用的是什么:r'?([\$][.*]+)'
我告诉它找到(...)的一个发生? 然后我告诉它找到一些以“$”开头的字符和任何可能出现的字符(所以我也可以得到小数点)。
不过,我得到的error: nothing to repeat
错误在开始的问号是nothing to repeat
错误的原因。
>>> import re
>>> re.compile(r'?')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/re.py", line 190, in compile
return _compile(pattern, flags)
File "/Users/mj/Development/venvs/stackoverflow-2.7/lib/python2.7/re.py", line 242, in _compile
raise error, v # invalid expression
sre_constants.error: nothing to repeat
匹配美元加上数字和点:
r'\$[\d.]+'
演示:
>>> re.search(r'\$[\d.]+', 'blah blah blah (blah $23.32 blah) blah blac (blah)').group()
'$23.32'
你应该提高对正则表达式的基本知识。错误是由于?在befinning。这是一个量词,在量词之前什么也没有。你使用*和+也没什么意义。不知道你的确切需求,很难提出更好的解决方案,因为你的正则表达式存在太多问题。
那么,根据http://docs.python.org/2/library/re.html,[.*]+
将匹配.*..*
,*....*
,*.*.*.
等......作为特殊字符失去套它们的含义。改为使用[.\d]+
或[.0-9]+
。
虽然对正则表达式的建议是更复杂模式的推荐方式(并且一般来说值得花时间学习),但对于简单情况还有其他方法。如果我对这个问题有所了解,似乎有点理解,比如:
x='blah blah blah (blah $23.32 blah) blah blac (blah)'
[i for i in x.split() if i.find('$') > -1]
会是一个非常简洁的方式。它返回一个字符串列表。
['$23.32']
或者,如果没有发现匹配,
[]
我不熟悉Python的正则表达式,但在许多其他语言中,第一个'?'就因为它是一种会引起问题量词,而在你的正则表达式中,它并没有量化任何价值。 – Vulcan
[为什么不使用](http://regex101.com/r/sM1wI4)'\ $ \ s * \ d +(?:\。\ d +)?'? – HamZa