蟒蛇正则表达式:匹配字符串只有一个字符
假设的例子有两个字符串:蟒蛇正则表达式:匹配字符串只有一个字符
$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 ""
>>> 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.')
>>>
正则表达式的细分:^
停泊在字符串的开始[^\$]*
零个或多个字符不$
\$
匹配一个美元符号[^\$]*
零个或多个不是的字符$
停泊在字符串的结尾
re.search("^[^$]*\$[^$]*$",test_string)
^.*?\$[^$]*$
这应该使的伎俩
不错的使用非贪婪的比赛 – 2010-07-02 14:42:57
嗯..虽然没有通过测试,除非有一些我需要的特殊标志:
>>> test(r"^.*?\$[^$]*$") $1 off $5 delicious ham <_sre.sre_match object at> $1 off any delicious ham <_sre.sre_match object at>– Chris 2010-07-02 14:51:14
你想用一个字符类[^]
的补充匹配其他任何字符比$
:
re.match(r"\$[0-9]+[^\$]*$","$1 off delicious $5 ham.")
是从原始的变化如下:
-
.*
替换[^\$]*
。新术语[^\$]
表示除字符串之外的任何字符$
-
$
附加到字符串。强制匹配扩展到字符串的末尾。 -
re.search
替换为re.match
。匹配整个字符串,而不是它的任何子集。
没有通过! >>>测试(R “\ $ [0-9] + [^ \ $] * $”) $ 1 OFF $ 5美味火腿 <_sre.sre_match> $ 1 OFF任何可口的火腿 – Chris 2010-07-02 14:56:15
>>> '$1 off delicious $5 ham.'.count('$')
2
>>> '$1 off delicious ham.'.count('$')
1
我同意,正则表达式会在这里矫枉过正。 – Duncan 2010-07-02 14:55:45
为什么不使用字符串的'.count()'方法? – 2010-07-02 14:37:10
我很喜欢把一个RE放入一个不让我添加任何额外逻辑的工具。所以我不能做“如果计数(str,”$“)> 1:通过”。我需要重新匹配这样的字符串。 – Chris 2010-07-02 14:52:38