首页
读书
网课
《python》目录


正文

Python 正则表达式是一种强大的工具,用于在文本中查找、匹配和操作符合特定模式的字符串。


导入模块

import re


匹配函数

函数语法

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

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

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

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

re.match: 从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回none。

re.search: 扫描整个字符串并返回第一个成功的匹配。

re.findall: 返回字符串中所有与模式匹配的非重叠匹配项的列表。

re.finditer: 返回一个迭代器,包含与模式匹配的非重叠匹配项的匹配对象。

参数说明

pattern(模式)

一个字符串,表示要匹配的正则表达式模式。用于在文本中查找特定的模式。

例如,pattern可以是一个简单的字符串模式,如 'hello',也可以是一个更复杂的正则表达式模式,如 '[0-9]+'(匹配一个或多个数字)。

pattern可以包含特殊字符和元字符,用于指定匹配规则和模式的特定部分。

string(目标字符串)

搜索匹配的目标字符串。

re.match()函数将尝试从目标字符串的起始位置开始匹配模式。

flags(标志)(可选)

可选的参数,用于控制正则表达式的匹配方式。

可以使用标志来 修改匹配的行为 ,例如忽略大小写、多行匹配等。

flags可以使用多个标志组合,以逻辑或(|)操作符分隔。

匹配成功 re.match 方法返回一个匹配的对象,否则返回 None。


获取匹配对象:


匹配对象具有以下常用方法和属性:


group()方法:

该方法返回匹配的字符串。

如果模式中使用了分组(正则表达式中使用圆括号括起来的部分),可以通过传递分组的索引或分组的名称来获取特定分组的匹配结果,表示从1到所含的小组号。group(num=0)表示匹配的整个表达式的字符串。

start()方法:

该方法返回匹配的起始位置在目标字符串中的索引。

end()方法:

该方法返回匹配的结束位置在目标字符串中的索引。

span()方法:

该方法返回一个元组,包含匹配的起始位置和结束位置的索引。

示例

re.match

import re


pattern = r"hello"

string = "hello world"


result = re.match(pattern, string)

if result:

    print("匹配成功")

else:

    print("匹配失败")


匹配成功

re.search

import re


pattern = r"world"

string = "hello world"


result = re.search(pattern, string)

if result:

    print("匹配成功")

else:

    print("匹配失败")


匹配成功

re.findall

import re


pattern = r"\d+"

string = "I have 123 apples and 456 oranges"


result = re.findall(pattern, string)

print(result)


['123', '456']

re.finditer

import re


pattern = r"\d+"

string = "I have 123 apples and 456 oranges"

#迭代器

result = re.finditer(pattern, string)

for match in result:

    print(match.group())


123

456



替换函数

函数语法

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

re.sub: 使用指定的替换字符串替换与模式匹配的所有子串。

参数说明

pattern: 要匹配的正则表达式模式。

repl: 替换匹配字符串的字符串或一个替换函数。

string: 要进行替换的字符串。

count (可选): 最大替换次数。默认为0,表示替换所有匹配项。

flags (可选): 匹配模式的标志。 返回替换后的字符串。

示例1

import re


pattern = r"apple"

repl = "orange"

string = "I have an apple."


result = re.sub(pattern, repl, string)

print(result)


I have an orange.

示例2

import re


def repl_func(match):

    word = match.group(0) #获取匹配到的完整单词

    #print(word)

    return word.upper()


pattern = r"\b\w+\b" 

string = "Hello, world! How are you today 123?"


result = re.sub(pattern, repl_func, string)

print(result)


HELLO, WORLD! HOW ARE YOU TODAY 123?


拆分函数

函数语法

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

re.split:根据给定的模式将字符串拆分为列表。

参数说明

pattern: 要匹配的正则表达式模式。

string: 要进行拆分的字符串。

maxsplit (可选): 最大拆分次数。默认为0,表示拆分所有匹配项。

flags (可选): 匹配模式的标志。 返回一个包含拆分后子字符串的列表。

示例

import re


pattern = r"[\s,;]+"  # 匹配连续的空白字符(制表符,换行符)、逗号和分号

string = "Hello, World; How are you today?\n I am fine; Thank you"


result = re.split(pattern, string)

print(result)


['Hello', 'World', 'How', 'are', 'you', 'today?', 'I', 'am', 'fine', 'Thank', 'you']

编译函数

函数语法

    re.compile(pattern, flags=0)

re.compile: 可以将正则表达式模式编译为模式对象,这样可以提高匹配效率并重复使用模式对象。它与直接使用匹配函数的区别在于,编译函数将正则表达式模式预先编译成一个可重复使用的对象,而不需要每次都重新解析和编译模式。

示例

import re


# 编译正则表达式模式,并使用多个标志

pattern = re.compile(r'hello', re.IGNORECASE | re.MULTILINE)


# 在文本中搜索匹配模式的所有位置

text = 'Hello World\nhello there\nHi, hello!'

matches = pattern.findall(text)


# 输出匹配结果

for match in matches:

    print('匹配成功:', match)


匹配成功: Hello

匹配成功: hello

匹配成功: hello


正则表达式语法

字面字符(Literal Characters)

字面字符直接匹配相应的字符。例如,正则表达式abc将匹配字符串中连续的字符"abc"。


元字符(Metacharacters):

元字符具有特殊的含义,用于表示一类字符或者某种特殊的匹配方式。常见的元字符包括:


.:匹配任意单个字符,除了换行符。

^:匹配字符串的开头。

$:匹配字符串的结尾。

*:匹配前面的模式零次或多次。

+:匹配前面的模式一次或多次。

?:匹配前面的模式零次或一次。

|:指定多个模式中的一个,匹配任意一个模式。

[]:定义字符集,匹配其中的任意一个字符。

():分组,用于控制匹配的顺序和提取匹配的子串。

\:转义字符,用于匹配特殊字符本身。

注意: 在正则表达式中,^符号有两种不同的含义,具体取决于它出现的位置:


当^位于字符类的开头,即[^...]形式,表示否定字符类,匹配除了指定字符类中的字符之外的任意一个字符。

当^位于正则表达式的开头,即^...形式,表示匹配字符串的开头位置。


字符集(Character Classes):

字符集用于匹配一个特定位置的多个字符中的任意一个。常见的字符集语法如下:


[abc]:匹配字符"a"、"b"或"c"。

[a-z]:匹配任意小写字母。

[A-Z]:匹配任意大写字母。

[0-9]:匹配任意数字。


预定义字符集(Predefined Character Classes):

预定义字符集是一些常用字符集的简写形式。常见的预定义字符集包括:


\d:匹配任意数字,相当于[0-9]。

\D:匹配任意非数字字符,相当于[^0-9]。

\w:匹配任意字母、数字或下划线,相当于[a-zA-Z0-9_]。

\W:匹配任意非字母、数字或下划线,相当于[^a-zA-Z0-9_]。

\s:匹配任意空白字符,包括空格、制表符、换行符等。

\S:匹配任意非空白字符。

\b:匹配单词边界,用于匹配单词字符和非单词字符之间的位置。

\B:匹配非单词边界,用于匹配不在单词字符和非单词字符之间的位置。

示例:


\b:单词边界是指一个单词字符与非单词字符之间的位置。单词字符包括字母、数字和下划线。

import re


pattern = r"\bapple\b" #r:不转义

text = "I have an apple and a pineapple."

matches = re.findall(pattern, text)

print(matches)  # 输出: ['apple']


['apple']

在这个例子中,正则表达式\bapple\b匹配独立的单词"apple",而不是包含在其他单词中的部分,如"pineapple"。


量词(Quantifiers):

量词用于指定模式的重复次数。常见的量词包括:


{n}:匹配前面的模式恰好出现n次。

{n,}:匹配前面的模式至少出现n次。

{n,m}:匹配前面的模式出现至少n次,最多m次。

*:匹配前面的模式零次或多次,相当于{0,}。

+:匹配前面的模式一次或多次,相当于{1,}。

?:匹配前面的模式零次或一次,相当于{0,1}。


修饰符(flags)

常用的flags包括:

re.IGNORECASE(或re.I):忽略大小写,使匹配对大小写不敏感。

re.MULTILINE(或re.M):多行模式,使^和$匹配每行的开头和结尾,而不仅仅是整个字符串的开头和结尾。

re.DOTALL(或re.S):点(.)匹配所有字符,包括换行符。

re.UNICODE(或re.U):启用Unicode匹配模式,使预定义字符类(如\w,\s)能够匹配Unicode字符。

re.LOCALE(或re.L):根据当前的本地化设置,使预定义字符类(如\w,\s)能够匹配本地化字符。

re.ASCII(或re.A):使预定义字符类(如\w,\s)仅匹配ASCII字符。

re.VERBOSE(或re.X):启用详细模式,可以在正则表达式中使用空白和注释,提高可读性。


条件组合

在正则表达式中,你可以使用多种方法来同时满足多个条件。下面是几种常用的方式:


字符串连接(Concatenation)

你可以按照条件的顺序将多个模式字符串连接在一起,形成一个整体的匹配模式。例如,正则表达式pattern1pattern2将要求字符串同时满足pattern1和pattern2。


示例:


字符串前用f开头表示格式化字符串(formatted string),可以在字符串中使用花括号({})作为占位符,并在其中指定要插入的变量或表达式。这些占位符可以包含格式说明符,用于指定变量在字符串中的显示格式。


格式化字符串只能在Python 3.6及更高版本中使用。在旧版本的Python中,可以使用str.format()方法来执行类似的字符串格式化操作。


import re


pattern1 = r"apple"

pattern2 = r"banana"

pattern3 = r"cherry"


combined_pattern = f"({pattern1}|{pattern2}|{pattern3})" 

text = "I have an apple and a banana."

matches = re.findall(combined_pattern, text)

print(matches)  # 输出: ['apple', 'banana']


['apple', 'banana']


字符串分组(Grouping):

你可以使用括号将多个模式字符串分组,以创建更复杂的匹配模式。分组可以通过括号进行嵌套,形成层次结构。例如,正则表达式(pattern1)(pattern2)将要求字符串同时满足pattern1和pattern2,并将每个模式的匹配结果分别捕获。


逻辑运算符(Logical Operators):

正则表达式提供了逻辑运算符来表示与、或、非等逻辑关系。常见的逻辑运算符包括:


|:表示或的关系。例如,正则表达式pattern1|pattern2将要求字符串满足pattern1或者pattern2。

(?=...):表示正向预查。例如,正则表达式pattern1(?=pattern2)将要求字符串满足同时满足pattern1和pattern2,但只匹配pattern1。

(?!...):表示负向预查。例如,正则表达式pattern1(?!pattern2)将要求字符串满足pattern1,但不能紧接着出现pattern2。

import re


pattern1 = r"(?=.*apple)"

pattern2 = r"(?=.*banana)"

pattern3 = r"(?=.*cherry)"


combined_pattern = f"an{pattern1}{pattern2}{pattern3}.*$"

text = "I have an apple, a banana, and a cherry."

match = re.search(combined_pattern, text)

if match:

    print("Match found!")

    print(match.group())

else:

    print("No match.")


Match found!

an apple, a banana, and a cherry.

在上述示例中,定义了三个模式字符串pattern1、pattern2和pattern3,分别表示包含"apple"、"banana"和"cherry"的条件。然后,使用正向肯定预查(?=...)将这些模式字符串连接在一起,并将它们作为整体的匹配条件。



上一篇: 没有了
下一篇: 没有了
圣贤书院