正则表达式——语法、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'>
目录
相关文章
|
6天前
|
Python
Python 内置正则表达式库re的使用
正则表达式是记录文本规则的代码,用于查找和处理符合特定规则的字符串。在Python中,常通过原生字符串`r&#39;string&#39;`表示。使用`re.compile()`创建正则对象,便于多次使用。匹配字符串有`match()`(从开头匹配)、`search()`(搜索首个匹配)和`findall()`(找所有匹配)。替换字符串用`sub()`,分割字符串则用`split()`。
21 3
|
6天前
|
Python Windows
【Python进阶必备】一文掌握re库:实战正则表达式
【Python进阶必备】一文掌握re库:实战正则表达式
14 0
|
6天前
|
Python
Python中的`re`模块:深入探索正则表达式的处理
正则表达式(Regular Expression,简称regex或regexp)是一种强大的文本处理工具,能够用来匹配、查找和替换复杂的文本模式。Python的`re`模块提供了正则表达式的相关功能,使得在Python中处理正则表达式变得非常简单和直观。
|
6天前
|
Linux Perl
使用awk和正则表达式过滤文本或字符串 - 详细指南和示例
使用awk和正则表达式过滤文本或字符串 - 详细指南和示例
85 0
|
6天前
|
Python
除了`re`模块,还有哪些库可以用于正则表达式的匹配?
【2月更文挑战第11天】【2月更文挑战第31篇】
|
6天前
正则表达式语法讲解
正则表达式语法讲解
19 0
|
6天前
|
开发者 Python
Python中的正则表达式:re模块详解与实例
Python中的正则表达式:re模块详解与实例
|
20小时前
|
数据安全/隐私保护 Python
Python进阶---正则表达式
Python进阶---正则表达式
9 2
|
4天前
|
数据采集 Python
python中的正则表达式,Python实习面试经验汇总
python中的正则表达式,Python实习面试经验汇总
|
6天前
|
Python
python正则表达式小结
1. **其他函数:**  `re`模块还提供了其他一些函数,例如 `re.search()`查找字符串中第一个匹配的部分,`re.findall()`查找所有匹配的部分,`re.sub()`替换匹配的部分。
10 0