我能否举例说明这三个元素(这些元素是否称为元字符?)有何不同?
我知道这*
意味着全有或全无,但我不确定这是否是正确的思考方式。另一方面.
,?
似乎是一样的。他们匹配一个字符,对吧?
ste*_*ver 35
您可能会将正则表达式与shell globs混淆
在正则表达式语法中.
表示任何单个字符(通常不包括换行符),而*
是一个量词,表示零个或多个前面的正则表达式原子(字符或组)。?
是一个量词,表示前一个原子的零个或一个实例,或者(在支持它的正则表达式变体中)一个将量词行为设置为非贪婪的修饰符。
在 shell globs 中,?
表示单个字符(如 regex 的.
)而*
表示零个或多个字符的序列(相当于 regex .*
)。
您可能会发现有用的一些参考资料是http://www.regular-expressions.info/quickstart.html和http://mywiki.wooledge.org/glob
Ser*_*nyy 20
直接取自维基百科:
? 问号表示前一个元素出现零次或一次。例如,colour?r 匹配“颜色”和“颜色”。
*星号表示前一个元素出现零次或多次。例如,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
Run Code Online (Sandbox Code Playgroud)
因为在colouur
字母 u(限定符之前的前一个元素?
)中出现了不止一次,它没有匹配到?
,而是匹配到了*
类似的例子:
$ printf "error\neror\ner\n" | egrep 'er?or'
eror
$ printf "error\neror\ner\n" | egrep 'er*or'
error
eror
Run Code Online (Sandbox Code Playgroud)
来自同一维基百科页面:
匹配任何单个字符(许多应用程序不包括换行符,具体哪些字符被视为换行符是特定于风味、字符编码和平台的,但可以安全地假设包含换行符)。在 POSIX 括号表达式中,点字符与文字点匹配。例如,ac 匹配“abc”等,但 [ac] 仅匹配“a”、“.”或“c”。
在我们的例子中,
$ printf "colour\ncolor\ncolouur\n" | egrep 'colo.r'
colour
$ printf "colour\ncolor\ncolouur\n" | egrep 'colou.r'
colouur
Run Code Online (Sandbox Code Playgroud)
恰如其分,最后一个读作 match any line that has "colou", plus any character, plus letter "r"
结论
您已经问过:“我知道 '*' 意味着全有或全无,但我不确定这是否是正确的思考方式。另一方面,'.' & '?' 好像一样。” 如您所见,点和星号并不完全相同。点对可能占据该特定位置的任何字符进行操作,而问号对前面的元素进行操作。
注意: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'
Run Code Online (Sandbox Code Playgroud)
在上面的例子中'?' 表示其前面的两位数字是可选的。它们可能不会出现或最多出现一次。
'.' 之间的区别 和 '?':
'.'
匹配/接受/验证它在正则表达式中的位置的任何单个字符。
例如:
pattern = re.compile(r'.ot')
pattern.findall('dot will identify both hot and got.')
Output: ['dot', 'hot', 'got']
Run Code Online (Sandbox Code Playgroud)
'?'
匹配/验证它前面的组的零次或一次出现。
检查手机号码示例。
也一样'*'
。它将检查在它之前出现的零次或多次组。
组合:
'.*'
: 接受尽可能多的序列。贪婪的方法。
'.*?
' 接受第一个匹配的序列并停止。非贪婪方法
有关更多信息,请考虑阅读以下两个问题...
归档时间: |
|
查看次数: |
38579 次 |
最近记录: |