【问题标题】:python regex: match a string with only one instance of a characterpython 正则表达式:匹配一个字符串,只有一个字符的一个实例
【发布时间】:2010-07-02 14:31:59
【问题描述】:

假设有两个字符串:

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

【问题讨论】:

  • 为什么不使用字符串的.count()方法呢?
  • 我正在将 RE 插入一个不允许我添加任何额外逻辑的工具中。所以我不能做“if count(str,"$") > 1: pass”。我需要 re 不匹配这样的字符串。

标签: python regex string


【解决方案1】:
>>> 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.')
>>>

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

【讨论】:

  • show-n-tell 的奖励积分。你有几分钟时间向我描述发生了什么事吗?
  • 0 或多个非美元符号后跟 1 美元后跟 0 或多个非美元符号
  • 您不需要在字符类中转义$r'^[^$]*\$[^$]*$' 也同样有效。
【解决方案2】:
>>> '$1 off delicious $5 ham.'.count('$')
2
>>> '$1 off delicious ham.'.count('$')
1

【讨论】:

  • 我同意,在这里使用正则表达式会有点矫枉过正。
【解决方案3】:

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

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

与您原来的更改如下:

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

【讨论】:

  • 没有通过! >>> test(r"\$[0-9]+[^\$]*$") 5 美元美味火腿减 1 美元 <_sre.sre_match> 任何美味火腿减 1 美元 <_sre.sre_match>
【解决方案4】:
re.search("^[^$]*\$[^$]*$",test_string)

【讨论】:

    【解决方案5】:
    ^.*?\$[^$]*$
    

    这应该可以解决问题

    【讨论】:

    • 很好地使用非贪婪匹配
    • Hmm.. 但是没有通过测试,除非我需要一些特殊的标志:
       >>> test(r"^.*?\$[^$]* $") 5 美元的美味火腿减 1 美元 <_sre.sre_match> 任何美味火腿减 1 美元 <_sre.sre_match>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2014-04-16
    • 1970-01-01
    • 2019-09-10
    • 2019-12-21
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多