正则表达式——语法、re模块的使用(附示例)

简介: 正则表达式——语法、re模块的使用(附示例)

正则表达式是处理字符串的强大工具,它有自己特定的语法结构,可以用来实现字符串的检索、替换、匹配验证。对于爬虫来说,有了它,从HTML里提取想要的信息也是非常的方便。


  • 优点:速度快,效率高,准确度高。
  • 缺点:新手上手难度有点高


不过只要你掌握了正则编写的逻辑关系,写出一个提取页面内容的正则其实并不复杂。


1 正则的语法


使用元字符进行排列组合用来匹配字符串,在线测试正则表达式https://tool.oschina.net/regex/

image.png

image.png


2 re模块


看完了上面正则表达式语法和匹配的相关介绍,也许会很懵,不用着急。通过下面的介绍示例很快就能掌握。


在Python中需要通过正则表达式对字符串进⾏匹配的时候,可以使⽤⼀个python自带的模块,名字为re。


正则表达式的大致匹配过程是:

  1. 依次拿出表达式和文本中的字符比较,
  2. 如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
  3. 如果表达式中有量词或边界,这个过程会稍微有一些不同。


2.1 match

match只能从字符串的开头进行匹配 ,返回的是match对象,匹配不成功则返回None,拿数据需要group()方法。


re.match(pattern, string, flags=0)

第一个参数传入正则表达式,第二个参数传入要匹配的字符串

import re
content='hello 123 python!'
result=re.match('h',content)
print(result)
print(result.group())
#运行结果
<re.Match object; span=(0, 1), match='h'>
h
------
content='hello 123 python!'
result=re.match('123',content)
print(result)
#运行结果
None


2.2 search

检查字符串的任意位置,匹配到了第一个结果,就会返回这个结果,如果匹配不上search返回的则是None。

import re
content='hello 123 python!'
result=re.search('123',content)
print(result)
print(result.group())
#运行结果
<re.Match object; span=(6, 9), match='123'>
123


2.3 findall

findall查找所有,返回list。


示例:查找字符串中所有的副词

import re
text = "He was carefully disguised but captured quickly by police."
rule="\w+ly"   # 匹配规则,\w匹配字母、数字、下划线,+与前面相连用来匹配多个字母
result=re.findall(rule, text)
print(result)
#运行结果
['carefully', 'quickly']


2.4 sub

除了使用正则表达式提取信息外,有时候还可以借助它来修改文本。

sub(pattern, repl, string, count=0, flags=0)

通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。


示例:删除文本中所有的数字

import re
text = "24he234l234lo 65p23y23t234ho7n"
result=re.sub("\d+","",text)
print(result)
#运行结果
hello python


2.5 compile

这个方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。

prog = re.compile(pattern)
result = prog.match(string)
#等价于
result = re.match(pattern, string)


下面在补充一个finditer方法,返回的是迭代器 从迭代器中拿到内容需要.group()

obj = re.compile(r"\d+")  #多个地方进行使用
ret= obj.finditer("我的电话是:10086,我女朋友的电话是:10010")
for i in ret:
    print(i.group())
#运行结果
10086
10010


3 实战注意事项


3.1 贪婪与非贪婪

惰性匹配 .*? 当出现多给匹配结果时 选尽可能少的结果 让星号尽可能少的出现结果 。

贪婪匹配 .* 与惰性相反,让星号尽可能多的出现结果 。


3.2 标志修饰符

正则表达式可以包含一些可选标志修饰符,来控制匹配的模式。

image.png


import re
text="""http:\\PYTHON.org very good
"""
result=re.match(r'^http.*?(py\w+).*?good',text)
print(result)
# 运行结果
None
------
# 添加修饰符
text="""http:\\PYTHON.org very good
"""
result=re.match(r'^http.*?(py\w+).*?good',text,re.I)
print(result)
# 运行结果
<re.Match object; span=(0, 26), match='http:\\PYTHON.org very good'>


3.3 原始字符串表示法

正则表达式用反斜杠字符 ('\') 表示特殊形式,或是允许在使用特殊字符时,不引发它们的特殊含义。 这与 Python 的字符串字面值中对相同字符出于相同目的的用法产生冲突;例如,要匹配一个反斜杠字面值,用户可能必须写成 '\\\\' 来作为模式字符串,因为正则表达式必须为 \\,而每个反斜杠在普通 Python 字符串字面值中又必须表示为 \\。


解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 'r' 前缀的字符串字面值中,反斜杠不必做任何特殊处理。 因此 r"\n" 表示包含 '\' 和 'n' 两个字符的字符串,而 "\n" 则表示只包含一个换行符的字符串。 样式在 Python 代码中通常都使用原始字符串表示法。

import re
text='http:\\python.org'
result=re.search('\\\\python',text)
print(result)
# 运行结果
<re.Match object; span=(5, 12), match='\\python'>
------
text='http:\\python.org'
result=re.search(r'\\python',text)  #差异点
print(result)
#运行结果
<re.Match object; span=(5, 12), match='\\python'>
目录
相关文章
|
3月前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
89 5
|
4月前
正则表达式的常用示例
正则表达式的常用示例
72 3
|
6月前
|
Python
告别死记硬背:掌握Python正则表达式re模块的高效应用&[面向百度编程]
Python中正则表达式的高效应用,通过内置的`re`模块,讲解了如何匹配、提取和替换字符串,并提供了相关示例代码,同时提倡通过实践来掌握正则表达式的使用,而不是仅仅依赖网络搜索。
69 1
|
6月前
|
SQL 分布式计算 算法
【python】python指南(三):使用正则表达式re提取文本中的http链接
【python】python指南(三):使用正则表达式re提取文本中的http链接
62 0
|
8月前
|
自然语言处理 JavaScript 前端开发
Python高级语法与正则表达式(二)
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
|
8月前
|
Python
python re 正则表达式库的使用
python re 正则表达式库的使用
61 0
Python 内置正则表达式库re的使用
正则表达式是记录文本规则的代码,用于查找和处理符合特定规则的字符串。在Python中,常通过原生字符串`r&#39;string&#39;`表示。使用`re.compile()`创建正则对象,便于多次使用。匹配字符串有`match()`(从开头匹配)、`search()`(搜索首个匹配)和`findall()`(找所有匹配)。替换字符串用`sub()`,分割字符串则用`split()`。
|
8月前
|
数据库 Python
Python网络数据抓取(8):正则表达式
Python网络数据抓取(8):正则表达式
89 2
|
8月前
|
安全 算法 Python
Python高级语法与正则表达式(一)
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。
|
8月前
|
Python
Python使用正则表达式分割字符串
在Python中,你可以使用re模块的split()函数来根据正则表达式分割字符串。这个函数的工作原理类似于Python内置的str.split()方法,但它允许你使用正则表达式作为分隔符。