我可以举一个例子,说明这三个元素(这些称为元字符)有何不同吗?
我知道这*
意味着全部或全部,但我不确定这是否是思考的正确方法。另一方面.
,?
似乎相同。他们匹配一个字符,对吗?
我可以举一个例子,说明这三个元素(这些称为元字符)有何不同吗?
我知道这*
意味着全部或全部,但我不确定这是否是思考的正确方法。另一方面.
,?
似乎相同。他们匹配一个字符,对吗?
Answers:
直接取自维基百科:
? 问号表示前一个元素出现零次或一次。例如,颜色匹配“颜色”和“颜色”。
*星号表示先前元素的出现次数为零或更多。例如,ab * c匹配“ ac”,“ abc”,“ abbc”,“ abbbc”,依此类推。
最大的区别是星号匹配零个或多个匹配项,而问号匹配零个或一个匹配项。比较这两个示例:
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou?r'
colour
color
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou*r'
colour
color
colouur
因为在colouur
字母u中(限定符之前的前一个元素?
)出现了多次,所以它与不匹配?
,但与匹配*
类似的例子:
$ printf "error\neror\ner\n" | egrep 'er?or'
eror
$ printf "error\neror\ner\n" | egrep 'er*or'
error
eror
在同一维基百科页面上:
匹配任何单个字符(许多应用程序不包括换行符,而哪些字符被视为换行符恰好是风味,字符编码和平台特定的,但是可以安全地假定包含换行符)。在POSIX括号表达式中,点字符与文字点匹配。例如,ac匹配“ abc”等,但是[ac]仅匹配“ a”,“。”或“ c”。
在我们的示例中
$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'
colouur
适当地,最后一个读为 match any line that has "colou", plus any character, plus letter "r"
结论
您已经问过:“我知道'*'表示全部或全部,但是我不确定这是否是正确的思考方式。而另一个'。&'?' 看起来一样。” 如您所见,点和星号并不完全相同。点对可能占据该特定位置的任何字符起作用,而问号对前面的元素起作用。
您可能会将正则表达式与Shell Glob混淆
在正则表达式中,语法.
表示任何单个字符(通常不包括换行符),而它*
是一个量词,表示零个或多个前面的正则表达式原子(字符或组)。?
是一个量词,表示零个或一个以上原子的实例,或者(在支持它的regex变体中)一个将量词行为设置为非贪婪的修饰符。
在Shell Glob中,?
代表单个字符(如regex .
),而*
代表零个或多个字符的序列(与regex等效.*
)。
您可能会发现有帮助的一些参考资料是http://www.regular-expressions.info/quickstart.html和http://mywiki.wooledge.org/glob
注意:Examples provided are in Python.
虽然概念保持不变。
'.'
是一个匹配符号,它匹配换行符以外的任何字符(re.DOTALL
在Python中也可以用参数覆盖)。因此,它也称为通配符。
'*'
是一个量词(定义元素出现的频率)。是{0,}的缩写。
这意味着“匹配零个或多个” -星星之前的组可以在文本中出现任意次。它可以完全不存在,也可以一遍又一遍地重复。
'?'
也是量词。是{0,1}的缩写。
意思是“匹配零或该问号之前的组之一”。也可以将其解释为问号之前的部分是可选的。
例如:
pattern = re.compile(r'(\d{2}-)?\d{10}')
mobile1 = pattern.search('My number is 91-9999988888')
mobile1.group()
Output: '91-9999988888'
mobile2 = pattern.search('My number is 9999988888')
mobile2.group()
Output: '9999988888'
在上面的示例中,“?” 表示它前面的两位数字是可选的,它们可能不出现或最多出现一次。
“。”之间的区别 和'?':
'.'
匹配/接受/验证其在正则表达式中所占位置的任何单个字符。
例如:
pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']
'?'
匹配/验证其前面的组的零个或单个出现。
查看手机号码示例。
相同'*'
。它将检查零个或多个出现在其前面的组。
组合:
'.*'
:接受尽可能多的序列。贪婪的态度。
'.*?
'接受第一个匹配的序列并停止。非贪婪方法
有关更多信息,请考虑阅读以下两个问题...