python regex:只匹配一个字符实例的字符串

时间:2010-07-02 14:31:59

标签: python regex string

假设有两个字符串:

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

在Python中,如果字符串中只有一个$,我可以使用匹配的正则表达式吗?即,我希望RE匹配第一个短语,但不是第二个短语。我试过像:

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

..说“匹配你看到$后跟任何东西除了另一个$。”在$$示例中没有匹配,但$ example上也没有匹配。

提前致谢!

检查的简单测试方法:

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 ""

5 个答案:

答案 0 :(得分: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.')
>>>

正则表达式的细分:
^在字符串开头处锚定 [^\$]*零个或多个不是$的字符 \$匹配美元符号
[^\$]*零个或多个不是$的字符 $锚定在字符串末尾

答案 1 :(得分:8)

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

答案 2 :(得分:2)

您希望使用字符类[^]补充来匹配$以外的任何字符:

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

原始版本的更改如下:

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

^.*?\$[^$]*$

这应该成功了