Python中的re正则表达式模块

一、re模块的基本使用

Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符。正则表达式是用来匹配处理字符串的。

假如你需要匹配文本中的字符\,Python里的使用原生字符串表示:r'\\'表示。同样,匹配一个数字的\\d可以写成r'\d'

1、python 中使用正则表达式需要引入re模块

import re  # 第一步,要引入re模块
a = re.findall("匹配规则", "这个字符串是否有匹配规则的字符")  # 第二步,调用模块函数
print(a)  # 以列表形式返回匹配到的字符串
# ['匹配规则']

2、常见元字符

  • ^元字符:匹配字符串开头。
  • $元字符:匹配字符串末尾。
  • *元字符:匹配前一个字符0或多次
  • +元字符:匹配前一个字符1次或无限次
  • ?元字符(防止贪婪匹配):匹配一个字符0次或1次:还有一个功能是在量词后面加上?号防止贪婪匹配 。
  • {}元字符(范围):自定义字符数{m}匹配前一个字符m次,
    {m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次
    {0,}匹配前一个字符0或多次,等同于*元字符
    {+,}匹配前一个字符1次或无限次,等同于+元字符
    {0,1}匹配前一个字符0次或1次,等同于?元字符
  • []元字符(字符集):[]里的任意一个字符就匹配字符集。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。
    所有特殊字符在字符集中都失去其原有的特殊含义。用\反斜杠转义恢复特殊字符的特殊含义。
  • [^]:反取,匹配出除[^]里面的字符
    ^元字符如果写到字符集里就是反取
  • \d:匹配任何十进制数,它相当于类[0-9]
  • \D:匹配任何非数字字符,它相当于类[^0-9]
  • \s:匹配任何空白字符,它相当于类[\t\n\r\f\v]
  • \S:匹配任何非空白字符,它相当于类[^\t\n\r\f\v]
  • \w:匹配包括下划线在内任何字母数字字符,它相当于类[a-zA-Z0-9_]
  • \W:匹配非任何字母数字字符包括下划线在内,它相当于类[^a-zA-Z0-9_]
  • ()元字符(分组):分组匹配。()里面的为一个组也可以理解成一个整体。
    如果()后面跟的是特殊元字符如 (adc)* 那么*控制的前导字符就是()里的整体内容,不再是前导一个字符。
  • |元字符(或):就是前后其中一个符合就匹配

二、re模块中常用功能函数

1、 正则表达式的两种书写方式

1、一种是直接在函数里书写规则,推荐使用

import re

a = re.findall("匹配规则", "这个字符串是否有匹配规则的字符")
print(a)  # ['匹配规则']

2、另一种是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。

re.compile(pattern[, flag])函数:用于将字符串形式的正则表达式编译为Pattern对象

这个方法是Pattern类的工厂方法。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。

另外,你也可以直接在pattern字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。

import re

# 将正则表达式编译成Pattern对象
pattern = re.compile(r'hello')

# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
match = pattern.match('hello world!')

if match:
    # 使用Match获得分组信息
    print(match.group())  # hello

2、匹配模式

下表是所有的正则匹配模式:

  • re.I:使匹配对大小写不敏感
  • re.L:做本地化识别(locale-aware)匹配
  • re.M:多行匹配,影响 ^ 和 $
  • re.S:使 . 匹配包括换行在内的所有字符
  • re.U:根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
  • re.X:该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

1、 re.S:扩展

在Python的正则表达式中,有一个参数为re.S。它表示 “.” 的作用扩展到整个字符串,包括“\n”。看如下代码:

import re

a = '''asdfhellopass:
    worldaf
    '''
b = re.findall('hello(.*?)world', a)
c = re.findall('hello(.*?)world', a, re.S)
print('b is ', b)  # b is  []
print('c is ', c)  # c is  ['pass:\n    ']

正则表达式中,“.”的作用是匹配除“\n”以外的任何字符,也就是说,它是在一行中进行匹配。这里的“行”是以“\n”进行区分的。a字符串有每行的末尾有一个“\n”,不过它不可见。

如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始,不会跨行。而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,将“\n”当做一个普通的字符加入到这个字符串中,在整体中进行匹配。

2、 re.I:不区分大小写

import re

res = re.findall(r"A", "abc", re.I)
print(res)# ['a']

3、 分组函数

?P :(只对正则函数返回对象时有用)# ?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容

取出匹配对象三种方法:(只对正则函数返回对象的有用)

  • group() # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来,有参取匹配到的第几个如2
  • groups() # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
  • groupdict() # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果

3、re.match(常用):从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None

match(pattern, string, flags=0)

  • pattern: 正则模型
  • string : 要匹配的字符串
  • falgs : 匹配模式

注意:match()函数 与 search()函数基本是一样的功能,不一样的就是match()匹配字符串开始位置的一个符合规则的字符串,search()是在字符串全局匹配第一个符合规则的字符串

import re

# 无分组
origin = "hello egon bcd egon lge egon acd 19"
r = re.match("h\w+", origin)  # match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
# hello
# ()
# {}

# 有分组
# 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
r = re.match("h(\w+)", origin)  # match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
# hello
# ('ello',)
# {}

# 有两个分组定义了key
# 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
# ?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
r = re.match("(?Ph)(?P\w+)", origin)
print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
# hello
# ('h', 'ello')
# {'n1': 'h', 'n2': 'ello'}

4、 re.search(pattern, string[, flags]):浏览整个字符串去匹配第一个符合规则的字符串,未匹配成功返回None

search(pattern, string, flags=0)

  • pattern: 正则模型
  • string : 要匹配的字符串
  • falgs : 匹配模式

注意:match()函数 与 search()函数基本是一样的功能,不一样的就是match()匹配字符串开始位置的一个符合规则的字符串,search()是在字符串全局匹配第一个符合规则的字符串

import re

# 无分组
origin = "hello alex bcd alex lge alex acd 19"
# search浏览全部字符串,匹配第一符合规则的字符串,浏览整个字符串去匹配第一个,未匹配成功返回None
r = re.search("a\w+", origin)
print(r.group() )  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups() )  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict() )  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
# alex
# ()
# {}

# 有分组
# 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
r = re.search("a(\w+).*(\d)", origin)
print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
# alex bcd alex lge alex acd 19
# ('lex', '9')
# {}

# 有两个分组定义了key
# 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
# ?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
r = re.search("a(?P\w+).*(?P\d)", origin)
print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
# alex bcd alex lge alex acd 19
# ('lex', '9')
# {'n1': 'lex', 'n2': '9'}

5、 re.findall()(常用):浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表

findall(pattern, string, flags=0)

  • pattern: 正则模型
  • string : 要匹配的字符串
  • falgs : 匹配模式

注意:一旦匹配成,再次匹配,是从前一次匹配成功的,后面一位开始的,也可以理解为匹配成功的字符串,不在参与下次匹配。

1、无分组:匹配所有合规则的字符串,匹配到的字符串放到一个列表中

import re
# 无分组
r = re.findall("\d+\w\d+", "a2b3c4d5")  # 浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
print(r)  # 注意:匹配成功的字符串,不在参与下次匹配,所以3c4也符合规则但是没匹配到
# ['2b3', '4d5']

注意:如果没写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的,空字符串列表

import re
# 无分组
r = re.findall("", "a2b3c4d5")  # 浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
print(r)  # 注意:如果没写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的,空字符串列表
# ['', '', '', '', '', '', '', '', '']

2、有分组:只将匹配到的字符串里组的部分放到列表里返回,相当于groups()方法

import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("a(\w+)", origin)  # 有分组:只将匹配到的字符串里,组的部分放到列表里返回
print(r)
# ['lex', 'lex', 'lex', 'cd']

注意:如果规则里只有一个组,而组后面是就表示组里的内容可以是0个或者多个,这样组里就有了两个意思,一个意思是匹配组里的内容,二个意思是匹配组里0内容(即是空白),所以尽量避免使用,否则会有可能匹配出空字符串

import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.findall("(a)*", origin)
print(r)
# ['', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', 'a', '', '', '', '', '', '', '', '', 'a', '', '', '', '', 'a', '', '', '', '', '', '']

3、多个分组:只将匹配到的字符串里组的部分放到一个元组中,最后将所有元组放到一个列表里返回。

相当于在group()结果里再将组的部分,分别拿出来放入一个元组,最后将所有元组放入一个列表返回

import re
origin = "hello alex bcd alex lge alex acd 19"
# 多个分组:只将匹配到的字符串里,组的部分放到一个元组中,最后将所有元组放到一个列表里返回
r = re.findall("(a)(\w+)", origin)
print(r)
# [('a', 'lex'), ('a', 'lex'), ('a', 'lex'), ('a', 'cd')]

4、分组中有分组:只将匹配到的字符串里组的部分放到一个元组中,先将包含有组的组,看作一个整体也就是一个组,把这个整体组放入一个元组里,然后在把组里的组放入一个元组,最后将所有组放入一个列表返回

import re
origin = "hello alex bcd alex lge alex acd 19"
# 分组中有分组:只将匹配到的字符串里,组的部分放到一个元组中,先将包含有组的组,看作一个整体也就是一个组,把这个整体组放入一个元组里,然后在把组里的组放入一个元组,最后将所有组放入一个列表返回
r = re.findall("(a)(\w+(e))", origin)
print(r)
# [('a', 'le', 'e'), ('a', 'le', 'e'), ('a', 'le', 'e')]

5、?:在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串。

注意?:只用于不是返回正则对象的函数如findall()

import re
origin = "hello alex bcd alex lge alex acd 19"
# ?:在有分组的情况下,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()
b = re.findall("a(?:\w+)", origin)
print(b)
# ['alex', 'alex', 'alex', 'acd']

6、re.split():根据正则匹配分割字符串,返回分割后的一个列表

split(pattern, string, maxsplit=0, flags=0)

  • pattern: 正则模型
  • string : 要匹配的字符串
  • maxsplit:指定分割个数
  • flags : 匹配模式

按照一个字符将全部字符串进行分割

import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.split("a", origin)  # 根据正则匹配分割字符串
print(r)
# ['hello ', 'lex bcd ', 'lex lge ', 'lex ', 'cd 19']

将匹配到的字符串作为分割标准进行分割

import re
origin = "hello alex bcd alex lge alex 2acd 19"
r = re.split("a\w+", origin)  # 根据正则匹配分割字符串
print(r)
# ['hello ', ' bcd ', ' lge ', ' 2', ' 19']

7、 re.sub():替换匹配成功的指定位置字符串

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

  • pattern: 正则模型
  • repl : 要替换的字符串
  • string : 要匹配的字符串
  • count : 指定匹配个数
  • flags : 匹配模式
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.sub("a", "替换", origin)  # 替换匹配成功的指定位置字符串
print(r)
# hello 替换lex bcd 替换lex lge 替换lex 替换cd 19

l = ['1 2 ', '2   3', '  3 4']
print(eval(re.sub(r'\s*', '', str(l))))
# ['12', '23', '34']

8、 re.subn():替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受

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

  • pattern: 正则模型
  • repl : 要替换的字符串
  • string : 要匹配的字符串
  • count : 指定匹配个数
  • flags : 匹配模式
import re

origin = "hello alex bcd alex lge alex acd 19"
a, b = re.subn("a", "替换", origin)  # 替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受
print(a)  # hello 替换lex bcd 替换lex lge 替换lex 替换cd 19
print(b)  # 4

到此这篇关于Python正则表达式模块的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python正则表达式(re模块)的使用详解

    目录 前言 re.match函数 匹配单个字符 匹配多个字符 匹配开头结尾 匹配分组 re.compile函数 re.search函数 re.findall函数 re.finditer函数 re.sub函数 re.subn函数 re.split函数 python贪婪和⾮贪婪 r的作⽤ 总结 前言 在Python中需要通过正则表达式对字符串进⾏匹配的时候,可以使⽤⼀个python自带的模块,名字为re. 正则表达式的大致匹配过程是: 1.依次拿出表达式和文本中的字符比较, 2.如果每一个字符都能匹

  • python模块之re正则表达式详解

    一.简单介绍 正则表达式是一种小型的.高度专业化的编程语言,并不是python中特有的,是许多编程语言中基础而又重要的一部分.在python中,主要通过re模块来实现. 正则表达式模式被编译成一系列的字节码,然后由用c编写的匹配引擎执行.那么正则表达式通常有哪些使用场景呢? 比如为想要匹配的相应字符串集指定规则: 该字符串集可以是包含e-mail地址.Internet地址.电话号码,或是根据需求自定义的一些字符串集: 当然也可以去判断一个字符串集是否符合我们定义的匹配规则: 找到字符串中匹配该规

  • Python的re模块正则表达式操作

    这个模块提供了与 Perl 相似l的正则表达式匹配操作.Unicode字符串也同样适用. 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\\\ "表示正则表达式中的" \ ",因为正则表达式中如果要匹配" \ ",需要用\来转义,变成" \\ ",而Python语法中又需要对字符串中每一个\进行转义,所以就变成了" \\\\ &

  • python re正则表达式模块(Regular Expression)

    模块的的作用主要是用于字符串和文本处理,查找,搜索,替换等 复习一下基本的正则表达式吧 .:匹配除了换行符以为的任意单个字符 *:匹配任意字符,一个,零个,多个都能匹配得到 俗称贪婪模式 +:匹配位于+之前的一个或者多个字符 |:匹配位于|之前或者之后的字符 ^:匹配行首 $:匹配行尾 ?:匹配位于?之前的零个或者一个字符,不匹配多个字符 \:表示 \ 之后的为转义字符 []:匹配[]之中的任意单个字符,[0-9]表示匹配0到9任意一个数字 ():将位于()之内的的内容当作一个整体 {}:按{}

  • python正则表达式re模块详细介绍

    本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮. 正则表达式使用反斜杆(\)来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义.这可能会和python字面意义上的字符串转义相冲突,这也许有些令人费解.比如,要匹配一个反斜杆本身,你也许要用'\\\\'来做为正则表达式的字符串,因为正则表达式要是\\,而字符串里,每个反斜杆都要写成\\. 你也可以在字符串前加上

  • Python基础教程之正则表达式基本语法以及re模块

    什么是正则: 正则表达式是可以匹配文本片段的模式. 正则表达式'Python'可以匹配'python' 正则是个很牛逼的东西,python中当然也不会缺少. 所以今天的Python就跟大家一起讨论一下python中的re模块. re模块包含对正则表达式的支持. 通配符 .表示匹配任何字符: '.ython'可以匹配'python'和'fython' 对特殊字符进行转义: 'python\.org'匹配'python.org' 字符集 '[pj]ython'能够匹配'python'和'jython

  • Python模块学习 re 正则表达式

    re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词. 复制代码 代码如下: import re text = "JGood is a handsome boy, he is cool, clever, and so on..." m = re.match(r"(\w+)\s", text) if m: print m.group(0), '\n', m.group(1) else: print 'not match' r

  • python re模块和正则表达式

    一.re模块和正则表达式 先来看一个例子:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/ 这是京东的注册页面,打开页面我们就看到这些要求输入个人信息的提示.假如我们随意的在手机号码这一栏输入一个11111111111,它会提示我们格式有误.这个功能是怎么实现的呢?假如现在你用python写一段代码,类似: phone_number = input('please input your phone number : ')

  • 正则表达式+Python re模块详解

    正则表达式(Regluar Expressions)又称规则表达式,在代码中常简写为REs,regexes或regexp(regex patterns).它本质上是一个小巧的.高度专用的编程语言. 通过正则表达式可以对指定的文本实现 匹配测试.内容查找.内容替换.字符串分割 等功能. re模块介绍 Python中的re模块提供了一个正则表达式引擎接口,它允许我们将正则表达式编译成模式对象,然后通过这些模式对象执行模式匹配搜索和字符串分割.子串替换等操作.re模块为这些操作分别提供了模块级别的函数

  • 浅谈python中的正则表达式(re模块)

    一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. 二.正则表达式中常用的字符含义 1.普通字符和11个元字符: 普通字符 匹配自身 abc abc . 匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符 a.c abc \ 转义字符,使后一个字符改变原来的意思 a\.c;a\\c a.c;a\c * 匹配前一个字

  • 详解Python正则表达式re模块

    正则是处理字符串最常用的方法,我们编码中到处可见正则的身影. 正则大同小异,python 中的正则跟其他语言相比略有差异: 1.替换字符串时,替换的字符串可以是一个函数 2.split 函数可以指定分割次数,这会导致有个坑 3.前项界定的表达式必须定长 下面详细描述下 re 模块的使用方法,其实,注意上面提到的三点差异就好 1.match 说明: re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回 None. 语法: re.match(pat

  • python正则表达式re模块详解

    快速入门 import re pattern = 'this' text = 'Does this text match the pattern?' match = re.search(pattern, text) s = match.start() e = match.end() print('Found "{0}"\nin "{1}"'.format(match.re.pattern, match.string)) print('from {0} to {1}

  • PYTHON正则表达式 re模块使用说明

    首先,运行 Python 解释器,导入 re 模块并编译一个 RE: #!python Python 2.2.2 (#1, Feb 10 2003, 12:57:01) >>> import re >>> p = re.compile('[a-z]+') >>> p <_sre.SRE_Pattern object at 80c3c28> 现在,你可以试着用 RE 的 [a-z]+ 去匹配不同的字符串.一个空字符串将根本不能匹配,因为 +

  • python的正则表达式和re模块详解,一起来看看

    目录 一.正则表达式基础 二.pythonre模块 三.进阶 总结 一.正则表达式基础 二.python re模块 注意:正则表达式 != re eg: 注意:如果返回的是对象,则需要使用group分组. 三.进阶 1.分组,使用()即可 028-888888 tel_num = "028-888888" pattern_obj = re.compile("(\d{3})-(\d{6})") res = re.match(pattern=pattern_obj, s

  • python的正则表达式re模块的常用方法

    1.re的简介 使用python的re模块,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息.python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配. 复制代码 代码如下: import re print re.__doc__ 可以查询re模块的功能信息,下面会结合几个例子说明. 2.re的正则表达式语法 正则表达式语法表如下: 语法 意义 说明 "." 任意字符 "^" 字符串开始

随机推荐