2013-03-05 79 views
2

我想要做的就是删除美元符号'$'。这看起来很简单,但我真的不知道为什么我的代码不工作。

import re 
input = '$5' 
if '$' in input: 
    input = re.sub(re.compile('$'), '', input) 
    print input 

输入仍然是'5美元'而不是'5'!谁能帮忙?

+3

'$'在正则表达式 – Madbreaks 2013-03-05 01:21:09

+0

NOOOO难怪其拥有的意义。谢谢! – user1899415 2013-03-05 01:25:24

回答

7

尝试使用replace代替:

input = input.replace('$', '') 

如Madbreaks指出的那样,$装置行的末尾匹配正则表达式。

这里是一个方便的链接到正则表达式:http://docs.python.org/2/library/re.html

+0

为什么?这不能回答这个问题,它提供了一种替代方法。为什么不解释为什么op的方法*不工作? – Madbreaks 2013-03-05 01:22:09

+0

@Madbreaks好的,你在评论中证实了这一点。 – squiguy 2013-03-05 01:22:52

+0

当然,但一个好的答案将解释为什么由op提供的示例代码不起作用。如果有一个很好的选择(你的选择),它也可能表明这一点。但是你还没有回答这个问题,你只是提供了一个解决方法。 – Madbreaks 2013-03-05 01:24:20

4

在这种情况下,我会使用str.translate

>>> '$$foo$$'.translate(None,'$') 
'foo' 

而对于基准目的:

>>> def repl(s): 
...  return s.replace('$','') 
... 
>>> def trans(s): 
...  return s.translate(None,'$') 
... 
>>> import timeit 
>>> s = '$$foo bar baz $ qux' 
>>> print timeit.timeit('repl(s)','from __main__ import repl,s') 
0.969965934753 
>>> print timeit.timeit('trans(s)','from __main__ import trans,s') 
0.796354055405 

有许多的str.replacestr.translate之间的差异。最值得注意的是str.translate对于用另一个字符切换1个字符很有用,而str.replace用另一个字符替换1个子字符串。所以,对于类似的问题,我想删除所有字符a,b,c,或者我想将a更改为d,我建议str.translate。相反,诸如“我想用def替换子字符串abc”的问题非常适合于str.replace

请注意,您的示例不起作用,因为$在正则表达式中具有特殊含义(它匹配字符串的末尾)。为了得到它与正则表达式的工作,你需要躲避$

>>> re.sub('\$','',s) 
'foo bar baz qux' 

工程确定。

+0

好的,但为什么?为什么op的方法没有用? – Madbreaks 2013-03-05 01:22:51

+0

Downvote删除,很好的答案。 +1 – Madbreaks 2013-03-05 01:25:55

+0

+1我总是从你的答案中学到一些东西。 – squiguy 2013-03-05 01:35:39

-1
从其他的答案

除此之外,您还可以使用strip()

input = input.strip('$') 
+0

为什么?为什么op的方法没有用? – Madbreaks 2013-03-05 01:23:16

+0

@Madbreaks'我想要做的就是删除美元符号'''。' – 2013-03-05 01:24:15

+0

这不是一个答案,它是解决方法。没有冒犯的意思。 – Madbreaks 2013-03-05 01:25:21

2

$是正则表达式特殊字符转换为

“字符串的结束”,你需要的,如果逃避它你想用它字面上

试试这个:

import re 
input = "$5" 
if "$" in input: 
    input = re.sub(re.compile('\$'), '', input) 
    print input