Python正则表达式 - " +?"相当于" *"

时间:2015-07-03 04:32:15

标签: python regex

   * : 0 or more occurrences of the pattern to its left
   + : 1 or more occurrences of the pattern to its left     
   ? : 0 or 1 occurrences of the pattern to its left

" +?"相当于" *"吗

如果存在,请考虑搜索任何3个字母的单词。

re1.search(r,'(\w\w\w)*,"abc")

在re1的情况下,*试图在其左边出现0次或更多次出现的图案,在这种情况下是3个字母的组。所以它要么试图找到一个3个字母的单词,要么失败

re2.search(r,'(\w\w\w)+?,"abc")

如果是re2,它应该提供相同的输出,但我对于为什么" *"而感到困惑。和"?+"是等价的。你能解释一下吗?

2 个答案:

答案 0 :(得分:4)

*+? 不等于。如果?跟随量词,则a+?具有特殊含义,使得量词 lazy

通常,量词是贪心,这意味着他们会尝试尽可能多地重复匹配;懒惰的量词匹配尽可能少。但a仍会匹配至少一个In [1]: re.search("(a*)(.*)", "aaaaaa").groups() Out[1]: ('aaaaaa', '') In [2]: re.search("(a+?)(.*)", "aaaaaa").groups() Out[2]: ('a', 'aaaaa')

(\w\w\w)*

在您的示例中,两个正则表达式恰好匹配相同的文本,因为(\w\w\w)+?In [12]: re.search(r"(\w\w\w)+?", "abcdef") Out[12]: <_sre.SRE_Match object; span=(0, 3), match='abc'> In [13]: re.search(r"(\w\w\w)+?", "ab") # No match In [14]: re.search(r"(\w\w\w)*", "abcdef") Out[14]: <_sre.SRE_Match object; span=(0, 6), match='abcdef'> In [15]: re.search(r"(\w\w\w)*", "ab") Out[15]: <_sre.SRE_Match object; span=(0, 0), match=''> 都可以匹配三个字母,并且输入中只有三个字母。但它们在其他字符串中会有所不同:

class Picture < ActiveRecord::Base
  belongs_to :gallery

  has_attached_file :image,
    :path => ":rails_root/public/images/:id/:filename",
    :url  => "/images/:id/:filename"

  do_not_validate_attachment_file_type :image
end 

class Gallery < ActiveRecord::Base
  has_many :pictures, :dependent => :destroy
end

答案 1 :(得分:-1)

如果你使用更简单的表达式运行,你会看到不一样:

import re
>>> re.search("[0-9]*", "1")
<_sre.SRE_Match object; span=(0, 1), match='1'>
>>> re.search("[0-9]*", "")
<_sre.SRE_Match object; span=(0, 0), match=''>
>>> re.search("[0-9]+", "")
>>> re.search("[0-9]+", "1")
<_sre.SRE_Match object; span=(0, 1), match='1'>

代码中的问题是(字)+?。是一个或多个或没有