字符 | 作用 |
---|---|
+ 加号 | 匹配前一个字符1次或多次 |
? 问号 | 匹配前一个字符0次或1次 |
管道 | 表示用或的方式找出数个字符串 |
() 括号 | 分组过滤被括起来的东西表示一个整体 |
\n | 引用前面()的内容 n为数字 |
[: /]+ | 匹配括号内的:或/字符1次或多次 |
a{n,m} | 匹配前一个字符最少n次,最多m次 |
a{n,} | 匹配前一个字符最少n次 |
a{n} | 匹配前一个字符正好n次 |
a{,m} | 匹配前一个字符最多m次 |
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
egrep 'oldboy|oldbey' oldboy.txt # 匹配oldboy或oldbey
符号 | 含义 | 应用场景 |
---|---|---|
[] | 1次匹配一个字符[oldboy] | 匹配单个字符[]和+ |
| | 匹配1个字符或多个字符 a|b|c oldboy|oldgirl | 匹配字符串时 |
我们现在想匹配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
字符 | 作用 |
---|---|
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
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次或多次的空格