Python 3 – 正则表达式

Python 3 – 正则表达式

Python是一种很优秀的编程语言,它有着强大的正则表达式模块用来处理字符串。正则表达式通常用于匹配、搜索甚至替换文本。而它可以通过编译生成一个模式来匹配字符串。在Python 3中,正则表达式可以通过re模块来实现。

re模块基本函数

Python 3 中,re模块提供了很多函数来支持正则表达式。下面是一些基本函数:

  • compile(pattern, flags=0):编译一个正则表达式成为一个对象。
  • match(pattern, string, flags=0):从起始位置开始匹配一个正则表达式,如果匹配成功则返回Match对象。
  • search(pattern, string, flags=0):扫描整个字符串查找匹配。
  • findall(pattern, string, flags=0):从整个字符串中查找所有匹配。
  • finditer(pattern, string, flags=0):与findall方法类似,但返回一个迭代器而不是一个列表。

下面是一些实例:

import re

# compile函数
pattern = re.compile('([a-z]+)-([a-z]+)')
result = pattern.match('hello-world')
print(result.group(0))  # hello-world
print(result.group(1))  # hello
print(result.group(2))  # world

# match函数
result = re.match('([a-z]+)-([a-z]+)', 'hello-world')
print(result.group(0))  # hello-world
print(result.group(1))  # hello
print(result.group(2))  # world

# search函数
result = re.search('([a-z]+)-([a-z]+)', 'The quick brown fox jumps over the lazy dog')
print(result.group(0))  # quick brown
print(result.group(1))  # quick
print(result.group(2))  # brown

# findall函数
result = re.findall('([a-z]+)-([a-z]+)', 'hello-world is a great idea')
print(result)  # [('hello', 'world')]

# finditer函数
result = re.finditer('([a-z]+)-([a-z]+)-([a-z]+)', 'hello-world-python')
for match in result:
    print(match.group())  # hello-world-python
    print(match.groups())  # ('hello', 'world', 'python')

正则表达式语法

正则表达式是由字符和特殊字符组成的一种规则表达式,它可以用来匹配、搜索和替换文本。下表列出了一些正则表达式语法的基本元素:

字符 描述
. 匹配任意字符(换行符除外)
^ 匹配字符串开始位置
$ 匹配字符串结束位置
* 匹配前一个字符出现0次或多次
+ 匹配前一个字符出现1次或多次
? 匹配前一个字符出现0次或1次
{m,n} 匹配前一个字符出现m次到n次
[abc] 匹配方括号中任意一个字符
(ab) 匹配括号中的整个正则表达式
\d 匹配任意数字字符
\D 匹配任意非数字字符
\w 匹配任意字符(包括数字和字母)
\W 匹配任意非字母数字字符
\s 匹配任意空格字符
\S 匹配任意非空格字符

下面是一些示例:

import re

# 匹配邮箱
pattern = re.compile('[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}')
result = pattern.match('python@gmail.com')
print(result.group(0))  # python@gmail.com

# 匹配IP地址
pattern = re.compile('^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.'
                     '([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.'
                     '([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.'
                     '([01]?\\d\\d?|2[0-4]\\d|25[0-5])$')
result = pattern.match('192.168.1.1')
print(result.group(0))  # 192.168.1.1

# 匹配HTML标签
pattern = re.compile('<[a-z]+>')
result = pattern.search('<p>Hello, world!</p>')
print(result.group(0))  # <p>

替换

正则表达式也可以用于字符串替换。在Python 3中,re模块提供了sub()函数来实现替换。

import re

pattern = re.compile('(blue|white|red)')
result = pattern.sub('color', 'blue socks and red shoes')
print(result)  # color socks and color shoes

修饰符

在正则表达式中,有许多可以在读取或匹配文件时启用或禁用的修饰符。 re模块支持修饰符并且可以使用组合方式。下面是一些修饰符:

修饰符 描述
re.I 匹配大小写不敏感
re.L 匹配本地化,根据当前环境字符集
re.M 多行匹配
re.S 匹配包括换行符在内的任意字符
re.U 匹配Unicode字符集
re.X 忽略正则表达式中的空白和注释

下面是一些示例:

import re

# 大小写匹配
pattern = re.compile('hello', re.I)
result = pattern.match('Hello, world!')
print(result.group())  # Hello

# 多行匹配
pattern = re.compile('^hello', re.M)
result = pattern.findall('hello world\nhello python\nhi there')
print(result)  # ['hello', 'hello']

# .匹配换行符
pattern = re.compile('.+', re.S)
result = pattern.match('hello\nworld')
print(result.group())  # hello\nworld

# 忽略空白和注释
pattern = re.compile('''
                       # 匹配手机号码
                       (0|86|17951)?
                       (\d{11})
                       ''', re.X)
result = pattern.match('13812345678')
print(result.group(2))  # 13812345678

结论

Python 3提供了re模块来支持正则表达式操作。我们可以使用基本函数如compile(), match(), search()等来完成基本匹配。正则表达式语法包含了很多基本元素用于匹配、搜索和替换文本。在替换中,我们可以使用sub()函数来完成替换操作。修饰符除了常见的I、M和S之外,还有其他很多修饰符用于不同的场景。最后,我们需要注意的是,正则表达式可以非常强大,但在处理特定的场景时也容易出现异常,我们需要根据实际情况去处理。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程