“。”之间的区别 ,'?' 和正则表达式中的“ *”?


Answers:


16

直接取自维基百科

? 问号表示前一个元素出现零次或一次。例如,颜色匹配“颜色”和“颜色”。

*星号表示先前元素的出现次数为零或更多。例如,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"

结论

您已经问过:“我知道'*'表示全部或全部,但是我不确定这是否是正确的思考方式。而另一个'。&'?' 看起来一样。” 如您所见,点和星号并不完全相同。点对可能占据该特定位置的任何字符起作用,而问号对前面的元素起作用。


32

您可能会将正则表达式Shell Glob混淆

在正则表达式中,语法.表示任何单个字符(通常不包括换行符),而它*是一个量词,表示零个或多个前面的正则表达式原子(字符或组)。?是一个量词,表示零个或一个以上原子的实例,或者(在支持它的regex变体中)一个将量词行为设置为非贪婪的修饰符

在Shell Glob中,?代表单个字符(如regex .),而*代表零个或多个字符的序列(与regex等效.*)。

您可能会发现有帮助的一些参考资料是http://www.regular-expressions.info/quickstart.htmlhttp://mywiki.wooledge.org/glob


6

注意: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']

'?'匹配/验证其前面的零个或单个出现。

查看手机号码示例。

相同'*'。它将检查零个或多个出现在其前面的组

组合:

'.*':接受尽可能多的序列。贪婪的态度

'.*?'接受第一个匹配的序列并停止。非贪婪方法

有关更多信息,请考虑阅读以下两个问题...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.