社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 正则表达式模块详解

Cassie1492949236626 • 5 年前 • 445 次点击  
阅读 21

Python 正则表达式模块详解

由于最近需要使用爬虫爬取数据进行测试,所以开始了爬虫的填坑之旅,那么首先就是先系统的学习下关于正则相关的知识啦。所以将下面正则方面的知识点做了个整理。语言环境为Python。主要讲解下Python的Re模块。

下面的语法我就主要列出一部分,剩下的在python官网直接查阅即可:docs.python.org/3/library/r…

一、基础语法总结

1.1、匹配单个字符

a . \d \D \w \W \s \S [...] [^...]

匹配单个字符(.)

规则:匹配除换行之外的任意字符
In [24]: re.findall("f.o","foo is not fao")
Out[24]: ['foo', 'fao']
复制代码

匹配任意(非)数字字符(\d \D)

\d   [0-9]
\D   [^0-9]
复制代码

匹配任意(非)普通字符(\w \W)

\w 普通字符 包括[_0-9A-Za-z] 同时也包括汉字
\W 非普通字符
复制代码

匹配任意(非)空字符(\s \S)

\s 匹配任意空字符  [\r\n\t]
\S 匹配任意非空字符
复制代码

匹配字符集合([...])

[A-Z][a-z][0-9][_123a-z]

匹配字符集([^...])

规则:字符集取非,除列出的字符之外的任意一个字符
[^abc] --> 除a b c之外任意字符
复制代码

1.2、匹配多个字符

* 匹配0次或者多次
+ 匹配1次或者多次
? 匹配0次或者1次
{m} 匹配m次
{m,n} 匹配m次到n次区间内的任意一次
复制代码

1.3、匹配位置

^ 匹配开始位置
$ 匹配结束位置
\A 匹配开始位置
\Z 匹配结束位置
\b 匹配单词边界位置(一般用于首字母大写的匹配)
\B 匹配非单词边界问题
复制代码

1.4、转义

在正则表达式中有一类特殊字符需要转移,只需要在特殊字符之间加上 \ 表示转移即可

. * + ? ^ $ [] {} () | \

1.5、子组

使用() 可以为正则表达式建立内部分组,子组为正则表达式的一部分,可以看做一个内部整体。

In [61]: re.search(r"(https|http|ftp):\/\/\w+\.\w+\.(com|cn)","https://www.baidu.com").group(0)
Out[61]: 'https://www.baidu.com'

In [62]: re.search(r"(https|http|ftp):\/\/\w+\.\w+\.(com|cn)","https://www.baidu.com").group(1)
Out[62]: 'https'
复制代码

1.6、贪婪模式和非贪婪模式

正则表达式的重复匹配总是尽可能多的向后匹配更多的内容。 贪婪模式包括:* + ? {m,n}

非贪婪模式:尽可能少的匹配内容 贪婪模式转换为非贪婪模式:*? +? ?? {m,n}?

In [106]: re.findall(r"ab+?","abbbbbbbb")
Out[106]: ['ab']

In [107]: re.findall(r"ab??","abbbbbbbb")
Out[107]: ['a']
复制代码

二、Re模块

接下来我所有函数里面的参数解释如下:

pattern:正则表达式
string:目标字符串
pos:截取目标字符串起始位置
endpose:截取目标字符串结束位置
flags:功能标志
replaceStr:替换的字符串
max:最多替换几处(默认替换全部)
复制代码

有上图我们看出来,接下来我们要将的Python中re模块、regex对象、match对象三者之间是存在一定关系的。

  • 1、re模块的compile方法返回一个regex对象
  • 2、re模块和regex对象的finditer()、fullmatch()、match()、search()等方法返回一个match对象
  • 3、他们分别有自己的属性和方法

2.1、compile

regex =  re.compile(pattern, flags = 0)  # 生成正则表达式对象

复制代码

2.2、findall

re.findall(pattern,string,pos,endpose)  # 从目标字符串中匹配所有符合条件的内容
复制代码

2.3、split

re.split(pattern,string,flags) #根据正则表达式对目标字符串进行分割

In [79]: re.split(r'\s+',"Hello World")
Out[79]: ['Hello', 'World']
复制代码

2.4、sub

re.sub(pattern,replaceStr,string,max,flags)

In [80]: re.sub(r'\s+',"##","hello world"


    
)
Out[80]: 'hello##world'
复制代码

2.5、subn

re.subn(pattern,replaceStr,string,max,flags)  #功能同sub,但是返回值返回替换后的字符串和替换了几处

In [80]: re.sub(r'\s+',"##","hello world")
Out[80]: ('hello##world',1)
复制代码

2.6、finditer

re.finditer(pattern,string)  #使用正则表达式匹配目标字符串,返回一个match对象,match对象调用group()之后才能拿到值

In [87]: it = re.finditer(r'\d+',"2014nianshiqiqngduo 08aoyun 512dizhen")

In [88]: for i in it:
   ....:     print(i)
   ....:     
<_sre.SRE_Match object at 0x7f0639767920>
<_sre.SRE_Match object at 0x7f0639767ac0>
<_sre.SRE_Match object at 0x7f0639767920>


In [93]: it = re.finditer(r'\d+',"2014nianshiqiqngduo 08aoyun 512dizhen")

In [94]: for i in it:
   ....:     print(i.group())
   ....:     
2014
08
512
复制代码

2.7、fullmatch

fullmatch(pattern,string,flags) #完全匹配目标字符串,相当于加了^ 和 $
复制代码

2.8、match

re.match(pattern,string,flags)  #匹配目标字符串开头的位置

复制代码

2.9、search

re.search(pattern,string,flags) #  正则表达式匹配目标字符串,只匹配第一处
复制代码

三、一些练习题

3.1、匹配首字母大写的单词

import re
f = open('test.txt')
pattern= r'\b[A-Z][a-zA-Z]*\s*'
# pattern= r'\b[A-Z]\S'
L = []

for i in f:
    L += re.findall(pattern,i)
print(L)
复制代码

test.txt文档内容如下:

Hello World -12.6
Nihao  123
How are you  -12
1.24
asdk 34%,
占比 1/2
2003 - 2005./%
复制代码

3.2、匹配数字(正数、负数、小数、百分数、分数)

import re
pattern = "-?\d+((/?\d+)|((\.)?\d+)|((\%)?))"
f = open('test.txt')
l = []
for line in f:
    l += re.finditer(pattern,line)

for i in l:
    print(i.group())
复制代码

今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/QZYH89eXqV
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/25965
 
445 次点击