正则表达式笔记
在正则表达式中,*、.* 和 .*? 都是用来匹配重复字符的模式,但它们的作用和行为有重要的区别。
1. *:零次或多次重复 (Quantifier)
* 本身是一个量词,它必须作用于它前面的一个字符、字符集或捕获组。
| 符号 | 含义 | 匹配行为 | 示例 |
X* |
零次或多次匹配前面的元素 X。 |
这是最基本的重复量词。 |
查找 - 在 - 在 - 在 |
2. .*:贪婪匹配 (Greedy Matching)
.* 是 . (点) 和 * (星号) 的组合,表示 匹配任何字符零次或多次。默认情况下,所有正则表达式的量词都是 贪婪(Greedy) 的。
| 符号 | 含义 | 匹配行为 | 示例 |
.* |
贪婪匹配 任何字符 (.) 零次或多次 (*)。 |
匹配时会尽可能多地向右延伸,直到整个模式的其余部分仍然能够匹配成功为止。 |
查找 - 在 |
3. .*?:非贪婪匹配 (Non-Greedy or Lazy Matching)
.*? 是在贪婪模式 .* 后面添加了一个问号 ?。问号在这里的作用是修饰量词,将其从贪婪模式切换到 非贪婪(Non-Greedy) 或 懒惰(Lazy) 模式。
| 符号 | 含义 | 匹配行为 | 示例 |
.*? |
非贪婪匹配 任何字符 (.) 零次或多次 (*)。 |
匹配时会尽可能少地向右延伸,只要满足整个模式的其余部分匹配成功即可。 |
查找 - 在 |
总结和对比
| 特性 | * (作用于前一个字符) | .* (贪婪匹配) | .*? (非贪婪匹配) |
| 匹配内容 | 零次或多次重复前面的元素。 | 零次或多次重复 任何字符。 | 零次或多次重复 任何字符。 |
| 匹配倾向 | 取决于前面的元素,默认贪婪。 | 尽可能多 (最长匹配)。 | 尽可能少 (最短匹配)。 |
| 应用场景 | 匹配单个字符或集合的重复,如 \d*。 |
匹配两个已知边界之间所有内容,如果边界是唯一的。 | 匹配两个 重复边界 之间最短的内容,如 HTML 标签 <tag>...</tag>。 |
2,
调试正则表达式 (Find/Replace)
1. 转义特殊字符 (最常见的原因)
在正则表达式中,.、(、) 和 " 都是特殊字符。您必须使用反斜杠 \ 来转义它们,让它们匹配字面意义上的字符。
| 您的原始表达式 | str((.*)).decode("raw_unicode_escape") |
| 推荐的查找表达式 (转义后) | str\((.*)\)\.decode\("raw_unicode_escape"\) |
正确的替换表达式格式
| IDE / 工具 | 格式 | 含义 |
| PyCharm / IntelliJ | strExt(\1) |
推荐使用 \1 |
| VS Code / Sublime | strExt($1) |
推荐使用 $1 |
| Vim | strExt(\1) 或 strExt(\01) |
|
Standard Unix sed |
strExt(\1) |

浙公网安备 33010602011771号