文章目录
| 字符 | 作用 |
|---|---|
| + 加号 | 匹配前一个字符1次或多次 |
| ? 问号 | 匹配前一个字符0次或1次 |
| 管道 | 表示用或的方式找出数个字符串 |
| () 括号 | 分组过滤被括起来的东西表示一个整体 |
| \n | 引用前面()的内容 n为数字 |
| [: /]+ | 匹配括号内的:或/字符1次或多次 |
| a{n,m} | 匹配前一个字符最少n次,最多m次 |
| a{n,} | 匹配前一个字符最少n次 |
| a{n} | 匹配前一个字符正好n次 |
| a{,m} | 匹配前一个字符最多m次 |
1 + 加号 匹配前一个字符1次或多次
grep命令默认只支持基础正则,我们一般用egrep和grep -E使用扩展正则
egrep '0+' oldboy.txt
grep -E '0+' oldboy.txt

用组合符号匹配连续出现的数字
egrep '[0-9]+' oldboy.txt

如果说我们不想要文件中其他的字符,只想要能匹配上的,加-o参数显示匹配过程即可
egrep -o '[0-9]+' oldboy.txt
egrep -o '[a-Z]+' oldboy.txt

2 | 管道 表示用或的方式找出数个字符串
egrep 'oldboy|oldbey' oldboy.txt # 匹配oldboy或oldbey

3 [] 与 |
| 符号 | 含义 | 应用场景 |
|---|---|---|
| [] | 1次匹配一个字符[oldboy] | 匹配单个字符[]和+ |
| | | 匹配1个字符或多个字符 a|b|c oldboy|oldgirl | 匹配字符串时 |
4 ()小括号 被括起来的内容表示一个整体
我们现在想匹配oldboy或者oldbey,用如下方式试试:
egrep "oldboy|oldbey" oldboy.txt
egrep "oldbo|ey" oldboy.txt

不行,该指令匹配的是oldbo或者ey这俩字符串。以下几种方式都能实现匹配oldboy或者oldbey:
egrep "oldboy|oldbey" oldboy.txt
egrep "oldb(o|e)y" oldboy.txt
egrep "oldb[oe]y" oldboy.txt

5 {} 连续出现 o{n,m} 前一个字母o,至少连续出现n次,最多连续出现m次
| 字符 | 作用 |
|---|---|
| a{n,m} | 匹配前一个字符最少n次,最多m次 |
| a{n,} | 匹配前一个字符最少n次(相当于逗号后是无穷大) |
| a{n} | 匹配前一个字符正好n次 |
| a{,m} | 匹配前一个字符最多m次,等价于a{0,m} |
egrep "0{1,3}" oldboy.txt # 匹配0字符最少1次,最多3次

egrep "0{3}" oldboy.txt # 匹配0字符正好出现3次
egrep -o "0{3}" oldboy.txt

6 ? 问号 匹配前一个字符0次或1次
egrep "god|gd" wen.txt
egrep "go?d" wen.txt

常见搭配
^$:匹配空行
[abc]+:匹配方括号内字符的任何排列形式
.*:匹配空行

正则习题
1)过滤出id.txt中符合要求的身份证号
要求:17位数字,最后一位是数字或者大写X
415342142157897865
4153421421
4153421421fdasfd
415342142154151427
415342142154151427fddsa
41534vczxv41514d27
415342142154151427
415342142145415435
415342147897987801
41534214215415142X
egrep -on "^[0-9]{17}[0-9X]$" id.txt

2)删除注释行以及空行
这需要用到grep的-v参数,反向查找,查找不满足正则的行
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def fact(j):
sum = 0
if j == 0:
sum = 1
else:
sum = j * fact(j - 1) # 乘法
return sum
# 打印
print (fact(5)) # 打印
egrep -nv '^$|^\s*#' 1.py # \s*表示匹配出现1次或多次的空格

本文详细介绍了正则表达式的各种元字符和符号,如加号、问号、管道、括号、花括号等,并通过实例展示了如何使用它们进行字符串匹配。讲解了如何匹配连续数字、使用或操作符、分组以及限定次数的匹配。同时,给出了两个实际问题的正则解决方案,分别是过滤身份证号和删除Python文件中的注释行和空行。

5070

被折叠的 条评论
为什么被折叠?



