03-数据解析_正则表达式(01 基本用法)

 首先导入正则表达式模块:

import re

1-正则表达式之单个字符匹配规则

1、匹配某个字符串
text = 'hello'
ret = re.match('he', text)
print(ret.group())

结果:
>>> print(ret.group())
he

2、点:匹配任意的字符
text = 'hello'
ret = re.match('.', text)
print(ret.group())

结果:
>>> print(ret.group())
h

3、\d: 匹配任意的数字(0-9)
text = '12'
ret = re.match('\d', text)
print(ret.group())

结果:
>>> print(ret.group())
1

4、\D: 匹配任意的非数字
text = '2B'
ret = re.match('\D', text)
print(ret.group())

5、\s:匹配空白字符(\n,\t,\r,空格)
text = '\r'
ret = re.match('\s', text)
print(ret.group())

6、\w: 匹配的是a-z,A-Z,数字和下划线
text = '+'
ret = re.match('\w', text)
print(ret.group())

7、\W与\w相反
text = 'a'
ret = re.match('\W', text)
print(ret.group())

8、[]组合的方式,只要满足中括号中的字符,就可以匹配
text = '0731-8888afa'
ret = re.match('[0-9]', text)
print(ret.group())
8.1、中括号的形势代替\d
text = '09'
ret = re.match('\[0-9]', text)
print(ret.group())
8.2、中括号的形势代替\D
text = '09'
ret = re.match('\[^0-9]', text)
print(ret.group())
8.3、中括号的形势代替\w
text = '_'
ret = re.match('\[a-zA-Z0-9_]', text)
print(ret.group())
8.4、中括号的形势代替\W
text = '0'
ret = re.match('\[^a-zA-Z0-9_]', text)
print(ret.group())

2-正则表达式之匹配多个多个字符

9、*: 可以匹配0或者任意多个字符
text = 'abcd'
ret = re.match('\s*', text)
print(ret.group())

10、+: 匹配1个或者多个字符
text = '+abcd'
ret = re.match('\w+', text)
print(ret.group())

11、?: 匹配一个或者0个(要么没有,要么只有一个)
text = 'abcd'
ret = re.match('\w?', text)
print(ret.group())

12、{m}: 匹配m个字符
text = 'abcd'
ret = re.match('\w{2}', text)
print(ret.group())

13、{m, n}: 匹配m-n个字符
text = 'abcdab'
ret = re.match('\w{1,5}', text)
print(ret.group())

 3-正则表达式之开始结束和或语法

^ (脱字号):表示以…开始:

text = 'hello'
ret = re.match('^h', text)  # 如果^是在中括号中,那么代码的是取反操作
print(ret.group())
结果:
>>> print(ret.group())
h

$:表示以……结束:

# 匹配163.com的邮箱
text = 'xxx@163.com'
ret = re.search('\w+@163\.com$', text)
print(ret.group())
结果:
>>>xxx@163.com

|:匹配多个表达式或者字符串:

text = 'world'
ret = re.search('hello|world', text)
print(ret.group())
结果:
>>> print(ret.group())
world

4-贪婪模式和非贪婪模式

贪婪模式和非贪婪模式:

贪婪模式:正则表达式会匹配尽量多的字符。默认是贪婪模式。

非贪婪模式:正则表达式会尽量少的匹配字符。

示例代码如下:

text = '0123456'
ret = re.match('\d+', text)
print(ret.group())
# 输出:因为默认为贪婪模式,所以会输出0123456
>>> print(ret.group())
0123456

改成非贪婪模式,那么就只会匹配到0。示例代码如下:

text = '0123456'
ret = re.match('\d+?', text)
print(ret.group())
# 输出
>>> print(ret.group())
0

5-正则表达式之转义字符和原生字符串(加‘r’)

在正则表达式中,有些字符是有特殊意义的字符。因此如果想要匹配这些字符,那么就必须使用反斜杠进行转义。比如$代表的是以……结尾,如果想要匹配&,那么就必须使用\&。示例代码如下:

text = 'apple price is &99, orange is &88'
ret = re.search('\&(\d*)', text)
print(ret.group())
# 输出
>>> print(ret.group())
&99

原生字符串:

在正则表达式中,\是专门用来转义的。在Python中,也是用来转义的。因此如果想要在普通的字符串中匹配出\, 那么要给

出四个\。示例代码如下:

text = 'apple \c'
ret = re.search('\\\\c', text)
print(ret.group())
输出:
>>> print(ret.group())
\c

 因此要使用原生字符串就可以解决这个问题:

text = 'apple \c'
ret = re.search(r'\\c', text)
print(ret.group())
输出:
>>> print(ret.group())
\c

前面加‘\’或者‘r’可以去除转义

注意:正则中 反斜杠 也有 特殊意思,例如:

text = '\\n'
ret = re.match('\\\\n', text)
print(ret.group())
输出:
>>> print(ret.group())
\n

6-正则表达式之group分组

 在正则表达式中,可以对过滤到的字符进行分组。分组使用圆括号的方式。

  1. group:和group(0)是等价的,返回的是整个满足条件的字符串。
  2. groups:返回的是里面的子组。索引从1开始。
  3. group(1):返回的是一个子组,可以传入多个。

示例代码如下:

# 正则表达式之group分组用法->代码示例
# import re
text = "apple's price is $99, orange's price is $10"
ret = re.match('.*(\$\d+).*(\$\d+)', text)
# 大组,等价于ret.group(0) 
ret.group()  # "apple's price is $99, orange's price is $10"
# 第一个分组
ret.group(1)  # '$99'
# 第二个分组
ret.group(2)  # '$10'
# 第1个和第2个分组
ret.group(1, 2)  # ('$99', '$10')
# 所有的子分组
ret.groups()

7-正则表达式之re模块常用函数

findall:

找出所有满足条件的,返回的是一个列表。

text = 'apple price is $99, orange is $88'
ret = re.findall('\d+', text)
print(ret)  # ['99', '88']

sub:

text = 'apple price is $99, orange is $88'
ret = re.sub('\d+', '0', text)
print(ret)  # apple price is $0, orange is $0

 

split:

text = 'hallo world ni hao'
ret = re.split('\W', text)
print(ret)  # ['hallo', 'world', 'ni', 'hao']

 

compile:

对于一些经常用到的正则表达式,可以使用compile进行编译,后期再使用的时候可以直接拿过来用,执行效率会更快。

而且compile还可以指定flag=VERBOSE,在写正则表达式的时候可以做好注释。示例代码如下:

1) compile基本用法举例

text = 'the number is 20.50'
r = re.compile('\d+\.?\d*')
ret = re.search(r, text)
print(ret.group())  # 20.50

2) vervose 可以分行加注释

text = 'the number is 20.50'
r = re.compile(r"""
    \d+  # 小数点前面的数字
    \.?  # 小数点本身
    \d*  # 小数点后面的数字
    """, re.VERBOSE)
ret = re.search(r, text)
print(ret.group())  # 20.50

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值