[声明]:本文参考了白夜黑雨老师的网页讲解。如有侵权,请与我联系!!!
Python 正则表达式小结1
1. 正则表达式验证
提供两个网站用于正则表达式的验证,可以敲入文本与正则表达式。通过该网站,验证正则表达式的正确性。非常好用!
英文网站
中文网站
2. 特殊元字符及含义
元字符 | 含义 |
---|---|
. | 表示要匹配除了 换行符 之外的任何 单个 字符 |
* | 星号-表示匹配前面的表达式任意次,包括0次 |
+ | 表示重复匹配前面的表达式一次或者多次,不包括0次 |
? | 表示匹配前面的子表达式0次或者1次 |
\ | 对字符的转义 |
[ ] | 匹配几个字符之一 |
^ | 表示匹配文档的开头位置 |
$ | 表示匹配文本的结尾 |
{ } | 匹配指定次数 |
| | 表示匹配其中之一 |
( ) | 括号称之为正则表达式的组选择 |
贪婪模式和非贪婪模式 | ?的使用 |
单行模式和多行模式 | 多行模式 re.MULTILINE 或者re.M |
使用 . 来匹配换行 | 使用DOTALL函数 |
DOTALL函数的使用 | 使用 . 来匹配换行符 |
3 匹配某种字符类型
反斜杠后面接一些字符,表示匹配 某种类型 的一个字符。比如
\d 匹配0-9之间任意一个数字字符,等价于表达式 [0-9]
\D 匹配任意一个不是0-9之间的数字字符,等价于表达式 [^0-9]
\s 匹配任意一个空白字符,包括 空格、tab、换行符等,等价于表达式 [\t\n\r\f\v]
\S 匹配任意一个非空白字符,等价于表达式 [^ \t\n\r\f\v]
\w 匹配任意一个文字字符,包括大小写字母、数字、下划线,等价于表达式 [a-zA-Z0-9_]
缺省情况也包括 Unicode文字字符,如果指定 ASCII 码标记,则只包括ASCII字母
\W 匹配任意一个非文字字符,等价于表达式 [^a-zA-Z0-9_]
反斜杠也可以用在方括号里面,比如 [\s,.] 表示匹配 : 任何空白字符, 或者逗号,或者点
4. 正则表达式举例
import re
content = '''苹果, 是绿色的
橙子, 是橙色
香蕉, 是黄色的
墙壁, 是白色的的的的的的
西瓜.是绿色的
乌鸦, 是黑色的'''
source = '<html><head><title>Title<title>'
source2 = '''韩立
上官婉儿
银月
Felix
宝花圣祖'''
source3 = 'a1b2c3d4e5.'
print("welcome back Felix")
p = re.compile(r'.色') # r 指类型为字符串类型,compile的用法是指将正则表达式编译为pattern对象
for one in p.findall(content):
print(one)
print('finish . test')
p1 = re.compile(r'.色的*') # * 表示匹配前面的子表达式任意次,包括0次
for one in p1.findall(content):
print(one)
print('finish * test')
p2 = re.compile(r'.色的+') # + 表示匹配前面的子表达式一次或者多次,不包括0次
for one in p2.findall(content):
print(one)
print('finish + test')
p3 = re.compile(r', .?') # ? 表示匹配前面的子表达式0次或者1次
for one in p3.findall(content):
print(one)
print('finish ? test')
p4 = re.compile(r'.色的{1,3}') # {3}/{3,4} 表示匹配指定次数
for one in p4.findall(content):
print(one)
print('finish {} test')
p5 = re.compile(r'<.*?>') #非贪婪模式
for one in p5.findall(source):
print(one)
print('finish 贪婪模式 test')
p6 = re.compile(r'.*\.') # 转义字符
for one in p6.findall(content):
print(one)
print('finish 转义字符 test')
p7 = re.compile(r'\w{2,6}', re.A) # 匹配字符类型
for one in p7.findall(source2):
print(one)
print('finish 匹配字符类型 test')
p8 = re.compile(r'[^\d]') #[]表示匹配其中之一,[akm.]表示匹配a或者k或者m或者.
for one in p8.findall(source3):
print(one)
print('finish [] test')
source4 = '''001-苹果价格-60
002-橙子价格-70
003-香蕉价格-80'''
p9 = re.compile(r'^\d+', re.M) # ^ 只会匹配文本的开始位置,这里需要使用多行模式
for one in p9.findall(source4):
print(one)
print('finish ^ test')
p10 = re.compile(r'\d+$', re.MULTILINE)
for one in p10.findall(source4):
print(one)
print('finish $ test')
p11 = re.compile(r'绿色|橙') # | 表示匹配其中之一,|在正则表达式的优先级是最低的
for one in p11.findall(content):
print(one)
print('finish | test')
p12 = re.compile(r'^(.*),', re.M) # ()分组,
for one in p12.findall(content):
print(one)
print('finish () test')
source4 = '''张三,手机号码15945678901
李四,手机号码13945677701
王二,手机号码13845666901'''
p13 = re.compile(r'^(.+),.+(\d{11})', re.MULTILINE)
for one in p13.findall(source4): #findall 返回一个列表,每个列表是一个元组
print(one)
print('finish () test2')
p14 = re.compile(r'^(?P<name>.+),.+(?P<phone>\d{11})', re.MULTILINE) #使用(?P<分组名>...) 给分组命名
for match in p14.finditer(source4):
print(match)
print(match.group('name'))
print(match.group('phone'))
大收藏家说
正则表达式对于文本内容提取,脚本编写,有非常强大的应用。在学校时候我就想学习下,奈何那会资源有限,无法系统的学习,现在掌握了,非常开心!!!
最近很喜欢高瓴资本的张磊说的一番话:
选择比努力重要,与谁同行比要去的远方更重要!
最本质的价值,实际上还是长期主义,你如果看的短,什么事都很难办,你稍微一拉长,很多事就看明白了!
流水不争先,争的是滔滔不绝呀!!!