1.内置库 re
正则表达式(Regular Expression,简称Regex或RegExp)是一种用于描述字符串模式的强大工具。它可以用来匹配、搜索、替换字符串,具有灵活性和强大的表达能力。在Python中,我们可以使用re
模块来使用正则表达式。
2.使用场景
(1)正则表达式是记录文本规则的代码
(2)正则表达式用于操作某些复杂的字符串、日志
(3)原生字符串需要在原生字符串上加上r' string'
3.基本的正则表达式元字符和它们的含义
.
:匹配任意字符(除了换行符\n
)。^
:匹配字符串的开头。$
:匹配字符串的结尾。*
:匹配前面的字符零次或多次。+
:匹配前面的字符一次或多次。?
:匹配前面的字符零次或一次。[]
:定义一个字符集,匹配其中的任意一个字符。()
:标记一个子表达式,用于分组操作
4.举例及详细说明
import re
# 示例 1: 匹配邮箱地址
email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
#这个email_pattern
是一个正则表达式,用于匹配邮箱地址的模式,
"""
^
:匹配字符串的开头。[a-zA-Z0-9_.+-]+
:匹配一个或多个大小写字母、数字、下划线、点、加号或减号。@
:匹配邮箱地址中的@符号。[a-zA-Z0-9-]+
:匹配一个或多个大小写字母、数字或减号。\.
:匹配点号(因为点号在正则表达式中有特殊含义,所以需要使用反斜杠转义)。[a-zA-Z0-9-.]+
:匹配一个或多个大小写字母、数字、减号或点号。$
:匹配字符串的结尾。
综合起来,这个正则表达式的模式可以匹配形如user@example.com
的邮箱地址。下面是一些匹配和不匹配的示例:
- 匹配:
user@example.com
,john.doe123@example.co.uk
- 不匹配:
user@.com
,user@com
,user@.123
"""
email = 'user@example.com'
if re.match(email_pattern, email):
print(f'{email} 是一个有效的邮箱地址')
else:
print(f'{email} 不是一个有效的邮箱地址')
# 示例 2: 查找字符串中的数字
text = 'Hello 123 World 456'
numbers = re.findall(r'\d+', text)
print('字符串中的数字:', numbers)
"""
re.findall(r'\d+', text)
是使用正则表达式在文本中查找所有连续的数字的匹配项。下面是对这个表达式的解释:
-
re.findall
:findall
是re
模块提供的一个函数,用于在文本中查找所有匹配的子字符串,并以列表形式返回。 -
r'\d+'
: 这是一个正则表达式,具体含义如下:\d
: 匹配任意数字(0-9)。+
: 匹配前面的字符(\d
)一次或多次
综合起来,re.findall(r'\d+', text)
的作用是在字符串 text
中找到所有连续的数字,并以列表的形式返回这些数字。
在上面的那个例子中,将会输出['123', '456']
"""
# 示例 3: 替换字符串中的空格为下划线
sentence = 'This is a sample sentence.'
modified_sentence = re.sub(r'\s', '_', sentence)
print('替换后的句子:', modified_sentence)
"""
re.sub(r'\s', '_', sentence)
是使用正则表达式替换字符串中所有空格为下划线的操作。下面是对这个表达式的解释:
-
re.sub
:sub
是re
模块提供的一个函数,用于在字符串中查找匹配的子字符串并进行替换。 -
r'\s'
: 这是一个正则表达式,具体含义如下:\s
: 匹配任意空白字符,包括空格、制表符、换行符等。
-
'_'
: 这是替换匹配到的空白字符的字符串,即将空格替换为下划线
综上所述,上面的例子将会输出 This_is_a_sample_sentence.
"""
# 示例 4: 提取文本中的日期
text_with_dates = 'Today is 2024-01-03, and tomorrow is 2024-01-04.'
dates = re.findall(r'\d{4}-\d{2}-\d{2}', text_with_dates)
print('提取的日期:', dates)
"""
re.findall(r'\d{4}-\d{2}-\d{2}', text_with_dates)
是使用正则表达式在文本中查找所有符合特定日期格式的匹配项。下面是对这个表达式的解释:
-
re.findall
:findall
是re
模块提供的一个函数,用于在字符串中查找所有匹配的子字符串,并以列表形式返回。 -
r'\d{4}-\d{2}-\d{2}'
: 这是一个正则表达式,具体含义如下:\d{4}
: 匹配包含四个数字的子字符串。-
: 匹配短横线。\d{2}
: 匹配包含两个数字的子字符串。-
: 匹配短横线。\d{2}
: 匹配包含两个数字的子字符串
综合起来,re.findall(r'\d{4}-\d{2}-\d{2}', text_with_dates)
的作用是在字符串 text_with_dates
中找到所有符合"YYYY-MM-DD"日期格式的子字符串,并以列表的形式返回这些日期字符串
所以上面的例子将会输出:['2024-01-03', '2024-01-04']
"""
5.总结
快速理解一个 Python 正则表达式需要注意以下几个方面:
元字符和字符类: 正则表达式中有一些特殊字符和字符类,如 .
、*
、+
、[]
等,它们具有特定的含义。
(1)特殊字符:
.
:匹配任意字符(除了换行符\n
)。^
:匹配字符串的开头。$
:匹配字符串的结尾。*
:匹配前面的字符零次或多次。+
:匹配前面的字符一次或多次。?
:匹配前面的字符零次或一次。|
:表示逻辑“或”,用于分隔多个模式,匹配其中任意一个。()
:标记一个子表达式,用于分组操作,影响限定符的作用范围。
(2)字符类:
\d
:匹配任意数字(0-9)。\D
:匹配任意非数字字符。\w
:匹配任意字母数字字符(包括下划线)。\W
:匹配任意非字母数字字符。\s
:匹配任意空白字符(包括空格、制表符、换行符等)。\S
:匹配任意非空白字符。
(4)字符范围:
[ ]
:定义一个字符类,匹配其中的任意一个字符。例如,[aeiou]
匹配任意一个元音字母。[^ ]
:在字符类内使用^
表示取反,匹配除了指定字符之外的任意字符。例如,[^0-9]
匹配任意非数字字符。
-
重复和限定符: 正则表达式中的
*
、+
、?
、{}
等符号用于表示模式中字符的重复或出现次数的限定。了解它们如何影响匹配是很重要的。 -
分组: 使用小括号
()
可以创建子表达式,这对于对模式进行分组和应用限定符、操作符等非常有用。 -
转义字符: 有些字符在正则表达式中有特殊含义,如果要匹配这些字符本身,需要使用反斜杠
\
进行转义。例如,.
在正则表达式中匹配任意字符,但\.
匹配实际的点号。 -
字符类: 使用方括号
[]
可以定义一个字符类,它匹配方括号中列举的任何一个字符。例如,[a-z]
表示匹配任何小写字母。 -
锚点:
^
和$
分别表示字符串的开头和结尾。它们用于确保模式匹配整个字符串而不是部分字符串。 -
预定义字符类: 如
\d
表示匹配任何数字字符,\w
表示匹配任何字母数字字符(包括下划线),\s
表示匹配任何空白字符等。 -
选择和分支: 使用
|
表示选择,可以匹配两个或多个模式之一。 -
修饰符: 正则表达式还可以包含修饰符,例如
re.IGNORECASE
,用于忽略大小写。 -
注释: 在正则表达式中使用
#
可以添加注释,提高可读性。
阅读正则表达式时,可以将其拆分成小块,逐个理解每个部分的含义。可以使用在线的正则表达式测试工具,将正则表达式和待匹配的文本输入,查看匹配结果,帮助理解正则表达式的行为。
最终,通过实际的例子和测试,逐步熟悉和理解正则表达式的使用。