2010-07-02 95 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

相關問題