2010-07-02 116 views
8

假设的例子有两个字符串:蟒蛇正则表达式:匹配字符串只有一个字符

$1 off delicious ham. 
$1 off delicious $5 ham. 

在Python,我可以有一个,只有一个$字符串中匹配时,一个正则表达式?也就是说,我希望RE能够匹配第一个短语,而不是第二个短语。我试过类似的东西:

re.search(r"\$[0-9]+.*!(\$)","$1 off delicious $5 ham.") 

..saying“匹配的地方你看到一个$,其次是任何东西,除了另一个$”。 $$示例中没有匹配,但在$示例中也没有匹配。

在此先感谢!对于检查

简单的测试方法:

def test(r): 
    s = ("$1 off $5 delicious ham","$1 off any delicious ham")  
    for x in s: 
    print x 
    print re.search(r,x,re.I) 
    print "" 
+2

为什么不使用字符串的'.count()'方法? – 2010-07-02 14:37:10

+0

我很喜欢把一个RE放入一个不让我添加任何额外逻辑的工具。所以我不能做“如果计数(str,”$“)> 1:通过”。我需要重新匹配这样的字符串。 – Chris 2010-07-02 14:52:38

回答

11
>>> import re 
>>> onedollar = re.compile(r'^[^\$]*\$[^\$]*$') 
>>> onedollar.match('$1 off delicious ham.') 
<_sre.SRE_Match object at 0x7fe253c9c4a8> 
>>> onedollar.match('$1 off delicious $5 ham.') 
>>> 

正则表达式的细分:
^停泊在字符串的开始
[^\$]*零个或多个字符不$
\$匹配一个美元符号
[^\$]*零个或多个不是的字符
$停泊在字符串的结尾

+0

show-n-tell的奖励积分。你有几分钟的时间向我描述发生了什么,在这里? – Chris 2010-07-02 14:43:46

+0

0个或多个非美元符号,后跟1个美元,后面跟着0个或多个非美元符号 – 2010-07-02 14:52:52

+0

确实非常有帮助;谢谢。 – Chris 2010-07-02 14:56:52

1
re.search("^[^$]*\$[^$]*$",test_string) 
1
^.*?\$[^$]*$ 

这应该使的伎俩

+0

不错的使用非贪婪的比赛 – 2010-07-02 14:42:57

+0

嗯..虽然没有通过测试,除非有一些我需要的特殊标志:

 >>> test(r"^.*?\$[^$]*$") $1 off $5 delicious ham <_sre.SRE_Match object at 0x00ED6288> $1 off any delicious ham <_sre.SRE_Match object at 0x00ED6288> 
Chris 2010-07-02 14:51:14

2

你想用一个字符类[^]补充匹配其他任何字符比$

re.match(r"\$[0-9]+[^\$]*$","$1 off delicious $5 ham.") 

是从原始的变化如下:

  1. .*替换[^\$]*。新术语[^\$]表示除字符串之外的任何字符$
  2. $附加到字符串。强制匹配扩展到字符串的末尾。
  3. re.search替换为re.match。匹配整个字符串,而不是它的任何子集。
+0

没有通过! >>>测试(R “\ $ [0-9] + [^ \ $] * $”) $ 1 OFF $ 5美味火腿 <_sre.SRE_Match在0x00ED65D0对象> $ 1 OFF任何可口的火腿 < _sre.SRE_Match对象在0x00ED65D0> – Chris 2010-07-02 14:56:15

8
>>> '$1 off delicious $5 ham.'.count('$') 
2 
>>> '$1 off delicious ham.'.count('$') 
1 
+1

我同意,正则表达式会在这里矫枉过正。 – Duncan 2010-07-02 14:55:45