Python/python14/3.md

77 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 数量词
来,继续加深对正则表达式的理解,这部分理解一下数量词,为什么要用数量词,想想都知道,如果你要匹配几十上百的字符时,难道你要一个一个的写,所以就出现了数量词。
数量词的词法是:{min,max} 。min 和 max 都是非负整数。如果逗号有而 max 被忽略了,则 max 没有限制。如果逗号和 max 都被忽略了,则重复 min 次。比如,`\b[1-9][0-9]{3}\b`,匹配的是 1000 ~ 9999 之间的数字( “\b” 表示单词边界),而 `\b[1-9][0-9]{2,4}\b`,匹配的是一个在 100 ~ 99999 之间的数字。
下面看一个实例,匹配出字符串中 4 到 7 个字母的英文
```Python
import re
a = 'java*&39android##@@python'
# 数量词
findall = re.findall('[a-z]{4,7}', a)
print(findall)
```
输出结果:
```txt
['java', 'android', 'python']
```
注意,这里有贪婪和非贪婪之分。那么我们先看下相关的概念:
贪婪模式:它的特性是一次性地读入整个字符串,如果不匹配就吐掉最右边的一个字符再匹配,直到找到匹配的字符串或字符串的长度为 0 为止。它的宗旨是读尽可能多的字符,所以当读到第一个匹配时就立刻返回。
懒惰模式:它的特性是从字符串的左边开始,试图不读入字符串中的字符进行匹配,失败,则多读一个字符,再匹配,如此循环,当找到一个匹配时会返回该匹配的字符串,然后再次进行匹配直到字符串结束。
上面例子中的就是贪婪的,如果要使用非贪婪,也就是懒惰模式,怎么呢?
如果要使用非贪婪,则加一个 `?` ,上面的例子修改如下:
```Python
import re
a = 'java*&39android##@@python'
# 贪婪与非贪婪
re_findall = re.findall('[a-z]{4,7}?', a)
print(re_findall)
```
输出结果如下:
```txt
['java', 'andr', 'pyth']
```
从输出的结果可以看出android 只打印除了 andr Python 只打印除了 pyth ,因为这里使用的是懒惰模式。
当然,还有一些特殊字符也是可以表示数量的,比如:
> `?`:告诉引擎匹配前导字符 0 次或 1 次
>
> `+`:告诉引擎匹配前导字符 1 次或多次
>
> `*`:告诉引擎匹配前导字符 0 次或多次
把这部分的知识点总结一下,就是下面这个表了:
| 贪 婪 | 惰 性 | 描 述 |
| ------- | ------- | ----------------------------- |
| | | 零次或一次出现,等价于{0,1} |
| + | + | 一次或多次出现 ,等价于{1,} |
| * | * | 零次或多次出现 ,等价于{0,} |
| {n} | {n} | 恰好 n 次出现 |
| {n,m} | {n,m} | 至少 n 次枝多 m 次出现 |
| {n,} | {n,} | 至少 n 次出现 |