2013-06-05 111 views
1

我试图捕捉在一条线上的美元金额:

例如: blah blah blah (blah $23.32 blah) blah blac (blah) 我想捕捉“$ 23.32”

这是我使用的是什么:r'?([\$][.*]+)'

我告诉它找到(...)的一个发生? 然后我告诉它找到一些以“$”开头的字符和任何可能出现的字符(所以我也可以得到小数点)。

不过,我得到的error: nothing to repeat

+2

我不熟悉Python的正则表达式,但在许多其他语言中,第一个'?'就因为它是一种会引起问题量词,而在你的正则表达式中,它并没有量化任何价值。 – Vulcan

+0

[为什么不使用](http://regex101.com/r/sM1wI4)'\ $ \ s * \ d +(?:\。\ d +)?'? – HamZa

回答

8

错误在开始的问号是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' 
1

你应该提高对正则表达式的基本知识。错误是由于?在befinning。这是一个量词,在量词之前什么也没有。你使用*和+也没什么意义。不知道你的确切需求,很难提出更好的解决方案,因为你的正则表达式存在太多问题。

1

虽然对正则表达式的建议是更复杂模式的推荐方式(并且一般来说值得花时间学习),但对于简单情况还有其他方法。如果我对这个问题有所了解,似乎有点理解,比如:

x='blah blah blah (blah $23.32 blah) blah blac (blah)' 
[i for i in x.split() if i.find('$') > -1] 

会是一个非常简洁的方式。它返回一个字符串列表。

['$23.32'] 

或者,如果没有发现匹配,

[]