Reputation: 1483
Suppose there are two strings:
$1 off delicious ham.
$1 off delicious $5 ham.
In Python, can I have a regex that matches when there is only one $ in the string? I.e., I want the RE to match on the first phrase, but not on the second. I tried something like:
re.search(r"\$[0-9]+.*!(\$)","$1 off delicious $5 ham.")
..saying "Match where you see a $ followed by anything EXCEPT for another $." There was no match on the $$ example, but there was also no match on the $ example.
Thanks in advance!
Simple test method for checking:
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 ""
Upvotes: 9
Views: 20088
Reputation: 38247
>>> 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.')
>>>
Breakdown of regexp:
^
Anchor at start of string
[^\$]*
Zero or more characters that are not $
\$
Match a dollar sign
[^\$]*
Zero or more characters that are not $
$
Anchor at end of string
Upvotes: 12
Reputation: 319531
>>> '$1 off delicious $5 ham.'.count('$')
2
>>> '$1 off delicious ham.'.count('$')
1
Upvotes: 7
Reputation: 58547
You want to use the complement of a character class [^]
to match any character other than $
:
re.match(r"\$[0-9]+[^\$]*$","$1 off delicious $5 ham.")
The changes from your original are as follows:
.*
replaced with [^\$]*
. The new term [^\$]
means any character other than $
$
appended to string. Forces the match to extend to the end of the string.re.search
replaced with re.match
. Matches the whole string, rather than any subset of it.Upvotes: 2