Python3中的re.findall()方法及re.compile()

目录
  • re.findall()方法及re.compile()
    • 1.例子
    • 2.re.compile()方法
    • 3.在使用findall()方法时的“坑”
  • 正则表达式findall函数问题

re.findall()方法及re.compile()

  • re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表;如果没有找到匹配的,则返回空列表。

返回结果是列表类型,需要遍历一下才能依次获取每组内容。

findall(patern, string, flags=0)
  • pattern : 正则中的模式字符串。
  • string : 要被查找替换的原始字符串。
  • flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

1.例子

import re 
content = 'Hello 123456789 Word_This is just a test 666 Test'
results = re.findall('\d+', content)    
 
print(results)
for result in results:
    print(result)

结果:

['123456789', '666']
123456789
666
 
Process finished with exit code 0

注意利用re.findall()函数没有group()和groups(),因为其返回结果是一个列表。

2.re.compile()方法

  • re.compile()方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。
re.compile(pattern[, flags])

re.compile()中可以传入忽略换行等匹配模式,这样在search()、findall()方法中就不需要额外传入了。

因此,re.findall()方法有2种表达方式:

import re
 
content = 'one1two22three333four4444'
pattern = re.compile(r'\d+')
print('===方法1:===')
result1 = re.findall(pattern, content)
print(result1)
 
print('===方法2===')
result2 = pattern.findall(content)
print(result2)

结果:

===方法1:===
['1', '22', '333', '4444']
===方法2===
['1', '22', '333', '4444']
 
Process finished with exit code 0

3.在使用findall()方法时的“坑”

注意正则表达式中括号()的使用

(1)正则表达式中当没有括号时,正常匹配:

import re 
 
str1 = '2345  3456  4567  5678  6789'
pattern_1 = re.compile('\w+\s+\w+') # \w 表示匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
print(pattern_1.findall(str1))

结果:

['2345  3456', '4567  5678']
 
Process finished with exit code 0

(2)正则表达式中有一个括号时,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果:

import re
 
str1 = '2345  3456  4567  5678  6789'
pattern_1 = re.compile('(\w+)\s+\w+') # \w 表示匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
print(pattern_1.findall(str1))

结果:

['2345', '4567']
 
Process finished with exit code 0

整个正则表达式执行了,只不过只输出括号匹配到的内容,即输出的是第一个 (\w+) 匹配到的内容:

在第一次匹配时跟上述没有括号时一样,匹配到"2345 3456",只不过只输出(/w+)匹配到的结果 即"2345";

第二次匹配同理,从"4567" 开始,匹配到"4567  5678",但是还是只是输出(/w+)匹配到的结果 即"4567"。

(3)当正则表达式中有两个括号时,其输出是一个list 中包含2个 tuple:

import re
 
str1 = '2345  3456  4567  5678  6789'
pattern_1 = re.compile('((\w+)\s+\w+)') # \w 表示匹配包括下划线的任何单词字符,等价于[A-Za-z0-9_]
print(pattern_1.findall(str1))

结果:

[('2345  3456', '2345'), ('4567  5678', '4567')]
 
Process finished with exit code 0

从输出的结果可以看出,结果中包含两个元组,每一个元组中有两个字符串。

第一个元组是第一次匹配的结果,其中的第一个字符串 "2345 3456" 是正则表达式最外面的括号

  • ((\w+)\s+\w+)

匹配输出的结果;

第一个元组中的第二个字符串 "2345"是正则表达式里面括号

  • (\w+)

匹配输出的结果 ;

第二个元组是第二次匹配的结果,匹配原理与第一次匹配相同。

正则表达式findall函数问题

在写正则表达式的时候总会遇到不少的问题, 特别是在表达式有多个元组的时候。下面看下re模块下的findall()函数和多个表达式元组相遇的时候会出现什么样的坑。

代码如下:

import re
str="a b c d"
regex0=re.compile("((\w )\s \w )")
print(regex0.findall(str))
regex1=re.compile("(\w )\s \w ")
print(regex1.findall(str))
regex2=re.compile("\w \s \w ")
print(regex2.findall(str))

结果:

[('a b', 'a'), ('c d', 'c')]
['a', 'c']
['a b', 'c d']

可能结果有点意外,下面解释一下

  • 第一个正则表达式中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple
  • 第二个正则表达式中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。
  • 第三个正则表达式中不带有括号,其输出的内容就是整个表达式所匹配到的内容。

结论:findall()返回的是括号所匹配到的结果(如regex1),多个括号就会返回多个括号分别匹配到的结果(如regex),如果没有括号就返回就返回整条语句所匹配到的结果(如regex2)。所以在提取数据的时候就需要注意这个坑。

实际上是由其并不是python特有的,这是 正则 所特有的 , 任何一门高级语言使用正则都满足这个特点:有括号时只能匹配到括号中的内容,没有括号【相当于在最外层增加了一个括号】。在正则里面 “()” 代表的是分组的意思,一个括号代表一个分组,你只能匹配到"()"中的内容

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python中re.findall函数实例用法

    1.findall函数返回字符串中所有匹配结果的正则表达式列表. 2.如果没有分组的正则是返回的正则匹配,分组返回的是分组匹配而非整个正则匹配. 实例 找到所有与pattern匹配的子串(不重叠),并将其放入列表. import re lst = re.findall("[1-9]\d*","qw21313h1o58p4kjh8123jkh8435u") for x in lst: print(x,end=" ") #输出结果:21313 1 5

  • Python3正则匹配re.split,re.finditer及re.findall函数用法详解

    本文实例讲述了Python3正则匹配re.split,re.finditer及re.findall函数用法.分享给大家供大家参考,具体如下: re.split re.finditer re.findall @(python3) 官方 re 模块说明文档 re.compile() 函数 编译正则表达式模式,返回一个对象.可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率. re 模块最离不开的就是 re.compile 函数.其他函数都依赖于 compile 创建的 正则表达式对象

  • python中正则表达式 re.findall 用法

    Python 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则表达式匹配和替换. re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数. 本文主要给大家介绍

  • Python3中的re.findall()方法及re.compile()

    目录 re.findall()方法及re.compile() 1.例子 2.re.compile()方法 3.在使用findall()方法时的“坑” 正则表达式findall函数问题 re.findall()方法及re.compile() re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表:如果没有找到匹配的,则返回空列表. 返回结果是列表类型,需要遍历一下才能依次获取每组内容. findall(patern, string, flags=0) pattern :

  • Python3中使用PyMongo的方法详解

    前言 本文主要给大家介绍的是关于在Python3使用PyMongo的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细介绍: MongoDB存储 在这里我们来看一下Python3下MongoDB的存储操作,在本节开始之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python的PyMongo库. 没有安装的朋友们可以参考这篇文章 连接MongoDB 连接MongoDB我们需要使用PyMongo库里面的MongoClient,一般来说传入MongoDB的IP及端口即可,

  • Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)

    我们可以利用urllib来抓取远程的数据进行保存哦,以下是python3 抓取网页资源的多种方法,有需要的可以参考借鉴. 1.最简单 import urllib.request response = urllib.request.urlopen('http://python.org/') html = response.read() 2.使用 Request import urllib.request req = urllib.request.Request('http://python.org

  • python3中property使用方法详解

    本文实例为大家分享了python3中的property使用方法,供大家参考,具体内容如下 property属性 定义 一个可以使实例方法用起来像实例属性一样的特殊关键字,可以对应于某个方法,通过使用property属性,能够简化调用者在获取数据的流程(使代码更加简明). property属性的定义和调用要注意以下几点: 调用时,无需括号,加上就错了:并且仅有一个self参数 实现property属性的两种方式 装饰器 新式类中的属性有三种访问方式,并分别对应了三个被 @property对应读取

  • python3中dict.keys().sort()用不了的解决方法

    原因是dict.keys()的返回结果不再是一个list了 Python3的keys(), values(), items()返回的都是迭代器,如果需要像Python2一样返回列表,只要传给list就行了: keys = list(mydict.keys()) 如果想要同时获得keys和values,永远应当使用items items = list(mydict.items()) 可以再将得到的元组序列拆成keys和values: keys = [k for k,v in items] valu

  • Python3实现将文件归档到zip文件及从zip文件中读取数据的方法

    本文实例讲述了Python3实现将文件归档到zip文件及从zip文件中读取数据的方法.分享给大家供大家参考.具体实现方法如下: ''''' Created on Dec 24, 2012 将文件归档到zip文件,并从zip文件中读取数据 @author: liury_lab ''' # 压缩成zip文件 from zipfile import * #@UnusedWildImport import os my_dir = 'd:/中华十大名帖/' myzip = ZipFile('d:/中华十大

  • Python3.X 线程中信号量的使用方法示例

    前言 最近在学习python,发现了解线程信号量的基础知识,对深入理解python的线程会大有帮助.所以本文将给大家介绍Python3.X线程中信号量的使用方法,下面话不多说,来一起看看详细的介绍: 方法示例 线程中,信号量主要是用来维持有限的资源,使得在一定时间使用该资源的线程只有指定的数量 # -*- coding:utf-8 -*- """ Created by FizLin on 2017/07/23/-下午10:59 mail: https://github.com

  • Python3处理文件中每个词的方法

    本文实例讲述了Python3处理文件中每个词的方法.分享给大家供大家参考.具体实现方法如下: ''''' Created on Dec 21, 2012 处理文件中的每个词 @author: liury_lab ''' import codecs the_file = codecs.open('d:/text.txt', 'rU', 'UTF-8') for line in the_file: for word in line.split(): print(word, end = "|"

  • python3中获取文件当前绝对路径的两种方法

    方法1: import sys print(sys.argv) 得到文件当前绝对路径字符串的一个列表 ['D:/pycharm/PracticeProject/ClientServerNetworking.py'] 方法2: import os print(os.getcwd()) print(os.listdir()) print(os.path.join(os.getcwd(),os.listdir()[1])) D:\pycharm\PracticeProject ['.idea', 'C

  • Python3 中把txt数据文件读入到矩阵中的方法

    1.实例程序: ''' 数据文件:2.txt内容:(以空格分开每个数据) 1 2 2.5 3 4 4 7 8 7 ''' from numpy import * A = zeros((3,3),dtype=float) #先创建一个 3x3的全零方阵A,并且数据的类型设置为float浮点型 f = open('2.txt') #打开数据文件文件 lines = f.readlines() #把全部数据文件读到一个列表lines中 A_row = 0 #表示矩阵的行,从0行开始 for line

随机推荐