假设有两个字符串:
$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 ""
答案 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.")
原始版本的更改如下:
.*
已替换为[^\$]*
。新术语[^\$]
表示$
$
附加到字符串。强制匹配延伸到字符串的末尾。re.search
已替换为re.match
。匹配整个字符串,而不是它的任何子集。答案 3 :(得分:1)
re.search("^[^$]*\$[^$]*$",test_string)
答案 4 :(得分:1)
^.*?\$[^$]*$
这应该成功了