* : 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,它应该提供相同的输出,但我对于为什么" *"而感到困惑。和"?+"是等价的。你能解释一下吗?
答案 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'>
代码中的问题是(字)+?。是一个或多个或没有