re
模块来实现正则表达式功能。
Python 内置的 re
模块提供了丰富的正则表达式操作。该模块包含多个函数,用于编译、匹配、搜索、替换等操作。下面我们逐一介绍这些函数。
re.compile()
函数用于编译正则表达式,返回一个 compiled regular expression 对象。可以通过该对象调用相关方法进行匹配和搜索操作。
pattern
:正则表达式的字符串形式。
flags
:可选参数,修改正则表达式的匹配方式。
re.match()
函数用于尝试从字符串的起始位置开始匹配正则表达式。如果正则表达式不匹配,则返回 None
,否则返回一个匹配对象。
pattern
:正则表达式的字符串形式。
string
:要匹配的字符串。
flags
:可选参数,修改正则表达式的匹配方式。
re.search()
函数用于在一个字符串中查找正则表达式的第一次出现。如果正则表达式不匹配,则返回 None
,否则返回一个匹配对象。
pattern
:正则表达式的字符串形式。
string
:要匹配的字符串。
flags
:可选参数,修改正则表达式的匹配方式。
re.findall()
函数用于搜索字符串中所有与正则表达式匹配的子串,并返回一个列表。
pattern
:正则表达式的字符串形式。
string
:要匹配的字符串。
flags
:可选参数,修改正则表达式的匹配方式。
re.sub()
函数用于替换字符串中与正则表达式匹配的子串。返回替换后的字符串。
pattern
:正则表达式的字符串形式。
repl
:用来替换匹配到的字符串的字符串。
string
:要匹配的字符串。
count
:可选参数,最多替换次数。
flags
:可选参数,修改正则表达式的匹配方式。
flags
参数flags
参数是用来指定正则表达式操作的额外选项,比如:是否忽略大小写、是否多行模式等。下面列出了常用的flags及其用法:
re.I
/ re.IGNORECASE
: 忽略大小写,例如:re.match('hello', 'Hello, world!', re.I)
re.M
/ re.MULTILINE
: 多行匹配,例如:re.search('^hello', 'hello\nworld', re.M)
re.S
/ re.DOTALL
: 让.
可以匹配包括\n
在内的任意字符,例如:re.match('.*', 'hello\nworld', re.S)
re.U
/ re.UNICODE
: 使用Unicode字符集而不是ASCII字符集,例如:re.match('\\w+', '你好,world!', re.U)
re.L
/ re.LOCALE
: 根据当前环境设置本地化标志,例如:re.match('\\w+', 'école', re.L)
需要注意的是,flags
参数可以通过按位或(|
)的方式同时使用多个flags,例如:re.match(pattern, string, re.I | re.M)
。
正则表达式是一种描述文本模式的语言,其语法相对复杂。下面是正则表达式的基本语法和常用操作符。
正则表达式由字符和操作符组成,其基本语法如下:
普通字符:除了特殊字符之外的所有字符都是普通字符。
特殊字符:特殊字符具有特殊的含义,例如元字符 .
匹配任意字符,字符类 [abc]
匹配 a
、b
、c
中的一个,量词符 {n,m}
匹配前一个字符出现次数为 n~m
次等等。
转义字符:使用反斜杠 \
后跟特殊字符可以匹配特殊字符本身。例如 \.
匹配小数点,\d
匹配数字等等。
模式修正符:在正则表达式开头使用一个或多个字母来修改正则表达式的匹配方式。例如 i
表示忽略大小写,m
表示多行模式等等。
正则表达式中的操作符非常丰富。下面我们介绍一些常用的操作符。
.
:匹配任意字符。
*
:匹配前一个字符出现 0 次或多次。
+
:匹配前一个字符出现 1 次或多次。
?
:匹配前一个字符出现 0 次或 1 次。
{n}
:匹配前一个字符出现 n 次。
{n,}
:匹配前一个字符出现至少 n 次。
{n,m}
:匹配前一个字符出现 n~m 次。
[]
:字符类,表示匹配其中的任意一个字符。
[^ ]
:否定字符类,表示不匹配其中的任何一个字符。
\d
:匹配数字。
\w
:匹配字母、数字或者下划线。
\s
:匹配空白字符,包括空格、制表符、换行符等。
^
:匹配字符串的起始位置。
$
:匹配字符串的结束位置。
()
:分组操作符,用于构建子表达式。 以上只是正则表达式语法的一部分,更详细的内容可以参考 Python 官方文档。
下面我们通过一些示例来演示如何使用 Python 的正则表达式功能。
假设我们要从一个字符串中提取出所有电话号码,并将其格式化输出。我们可以使用以下代码:
import re
text = '我的电话号码是 13812345678,你可以随时给我打电话。'
pattern = r'1\d{10}'
phone_numbers = re.findall(pattern, text)
print('找到 {} 个电话号码:'.format(len(phone_numbers)))
for phone_number in phone_numbers:
formatted_phone_number = '{} {} {} {}'.format(phone_number[0:3], phone_number[3:7], phone_number[7:9], phone_number[9:])
print(formatted_phone_number)
上述代码使用正则表达式 r'1\d{10}'
匹配所有以 1
开头,后面跟着 10 位数字的子串。re.findall()
函数返回一个包含所有匹配子串的列表。
假设我们要从一个字符串中提取出所有邮箱地址,并将其格式化输出。我们可以使用以下代码:
import re
text = '我的邮箱地址是 xyz@example.com,欢迎给我发邮件。'
pattern = r'\w+@\w+\.\w+'
email_addresses = re.findall(pattern, text)
print('找到 {} 个邮箱地址:'.format(len(email_addresses)))
for email_address in email_addresses:
print(email_address)
上述代码使用正则表达式 r'\w+@\w+\.\w+'
匹配所有符合邮箱地址格式的子串。其中 \w
匹配字母、数字或下划线,+
表示匹配前一个字符一次或多次,\.
匹配小数点。
在使用正则表达式时需要注意其复杂的语法和相应的操作符,但只要掌握了基本用法,就可以有效地处理各种文本数据。