数据解析-正则表达式

1、概念

正则表达式,也称为正规表示法、正规表达式、常规表示法,是计算机科学中的一个概念。

  • 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串;
  • 许多程序设计语言都支持利用正则表达式进行字符串操作。

2、re模块


2.1 match()

从起始位置开始匹配,可以使用group()或groups()获取正则表达式匹配到的内容。

import re
re.match(pattern, string, flags)
参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
# 获取匹配字符内容
import re

text = "www.baidu.com"

r1 = re.match("www", text)
r2 = re.match("com", text)

print(r1.group())
try:
    print(r2.group())
except:
    print("这种方式获取不到想要内容")
   
# 返回内容
>>>www
>>>这种方式获取不到想要内容
2.2 search()

扫描整个字符串,如果匹配到第一个结果直接返回,没有则返回None。

# 参数含义与match一样
re.search(pattern, string, flags)
import re

text = "www.baidu.com"

# 获取匹配字符位置
r1 = re.search("www", text).span()
r2 = re.search("com", text).span()
print(str(r1) + "\n" + str(r2)) # 获取位置以元组形式返回,转换为字符串与换行符拼接输出

>>>(0, 3)
>>>(10, 13)
2.3 findall

查找整个字符串,返回list

# 参数含义与match一样
re.findall(pattern, string, flags)
import re

text_ = "author_justinc"

r1 = re.findall("t", text_)
r2 = re.findall(r'(\w+)=(\d+)', html_)
print(r1)
print(r2)

>>>['t', 't']
>>>[('width', '640'), ('height', '480')]
2.4 compile

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

# 参数含义与match一样
re.compile(pattern, flags)
import re
pattern = re.compile(r'\d+')
data = pattern.match('123abc').group()

print(data)

>>>123
2.5 split

拆分字符串,和字符串当中的.split()作用一直,可以指定分割次数。

re1 = re.split(r"分割符",var1,maxsplit=1)
  • maxsplt表示分割次数
import re

text = "www.baidu.com"

# 在正则表达式中,. 是一个特殊字符,它匹配除换行符之外的任何单个字符。所以应该使用转义符号来达到所设想的效果
re1 = re.split(r"\.", text, maxsplit=1)
re2 = re.split(r"\.", text, maxsplit=2)

print(re1)
print(re2)

>>>['www', 'baidu.com']
>>>['www', 'baidu', 'com']
2.6 sub

sub方法类似字符串的replace()方法,用指定内容替换匹配到的字符,可以指定替换次数。

re.sub(r"匹配内容","替换内容",字符串,count=0)
  • count:替换次数,当count=0时,表示没有限制替换次数,会尽可能多的替换。
import re

text = "www.baidu.com"

re1 = re.sub(r"\.", " ", text, count=0)
re2 = re.sub(r"\.", " ", text, count=1)
re3 = re.sub(r"com", "cn", text, count=1)

print(re1)
print(re2)
print(re3)

>>>www baidu com
>>>www baidu.com
>>>www.baidu.cn
2.7 finditer

finditer与findall差不多,返回的对象是迭代器。

import re

text_ = "author_justinc"

re1 = re.finditer("u", text_)
for i in re1:
    print(i.group()) # 必须遍历后才能获取其返回的具体值
print(re1)


>>>u
>>>u
>>><callable_iterator object at 0x000002493BF25E10>

3、正则字符


3.1 修饰符
修饰符描述
re.I使匹配对大小写不敏感
re.M多行匹配,使^$能够匹配字符串中每一行的开始和结束。
re.S使.匹配,包括换行在内的所有字符
re.U根据unicode字符集解析字符,这个标志会影响\w,\W\b,\B
re.AASCII字符模式
3.2 元字符
字符描述
.小数点可以匹配除了换行符\n以外的任意字符,只能匹配一个
``
[abc]匹配字符集所包含的任意一个字符。
[^abc]匹配未包含的任意字符。
[a-z]字符范围。匹配指定范围内的任意字符。
\将紧跟后面的字符进行转义。
()对表达式进行分组,将圆括号的内容当做一个整体,并获得匹配的值
3.3 转义字符
字符描述
\\n匹配一个换行符。
\\r匹配一个回车符。
\\t匹配一个制表符。
\\匹配一个斜杠
\\^匹配^符号
\\$匹配$符号
\.匹配小数点.
3.4 预定义匹配字符集
字符描述
\d匹配一个数字字符。等价于 [0-9]。
\w匹配字母、数字、下划线。等价于[A-Za-z0-9_]
\s匹配空白字符
\D匹配一个非数字字符。等价于 [^0-9】。
\W匹配非字母、数字、下划线。等价于 [^A-Za-z0-9_]
\S匹配任何非空白字符。
3.5 重复匹配
字符描述
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
3.6 贪婪与非贪婪
3.6.1 贪婪模式

贪婪模式:在默认情况下,正则表达式的工作模式是贪婪的,这意味着它会尽可能多匹配字符。

  • *:匹配前面的子表达式零次或多次,尽可能多的匹配。
  • +:匹配前面的子表达式一次或多次,尽可能多的匹配。
  • ?:匹配前面的子表达式零次或一次,当后面跟着其他量词时,它使前面的量词变为贪婪的。
  • {m,n}:匹配前面的子表达式至少 m 次,但不超过 n 次,尽可能多的匹配。
3.6.2 非贪婪模式

非贪婪模式(懒惰模式):匹配尽可能少的字符。非贪婪量词通过在贪婪量词后面加上一个?来表示。

  • *?:匹配前面的子表达式零次或多次,尽可能少的匹配。
  • +?:匹配前面的子表达式一次或多次,尽可能少的匹配。
  • ??:匹配前面的子表达式零次或一次,尽可能少的匹配。
  • {m,n}?:匹配前面的子表达式至少 m 次,但不超过 n 次,尽可能少的匹配。

示例代码地址:https://gitee.com/justinc666/crawler/tree/master/正则表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值