您的位置:

学习Python正则表达式的必备技巧

正则表达式是一种通用的字符串匹配工具,可以快速地对字符串进行搜索和替换。Python内置了re模块,可以方便地使用正则表达式进行字符串操作。本文将介绍学习Python正则表达式的必备技巧,包括基本语法、正则表达式的元字符、常用的正则表达式操作等方面。

一、基本语法

正则表达式是一种由字符、元字符组成的文本模式,用于描述一类字符串。正则表达式可以用来匹配、查找、替换字符串。下面是一些基本的正则表达式语法:

1.1 字符集

字符集表示匹配一个字符集中的任意一个字符。可以使用中括号 [] 来表示字符集,如 [abc] 匹配 a、b 或 c 中的任意一个字符。

# 匹配一个由 a、b 或 c 构成的字符
import re

str = "abc123"
pattern = '[abc]'
result = re.findall(pattern, str)
print(result)
输出结果:
['a', 'b', 'c']

1.2 元字符

元字符是一些特殊的符号,用于表示特定的字符、字符集或重复次数。下面是一些常用的元字符:

· (点号):表示任意一个字符。

\d:表示任意一个数字。

\w:表示任意一个字母、数字或下划线。等价于 [a-zA-Z0-9_]。

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

# 匹配一个以冒号开头的文本行
import re

str = "Name: John\nAge: 28"
pattern = '^Name:.*'
result = re.findall(pattern, str, re.M)
print(result)
输出结果:
['Name: John']

1.3 重复次数

重复次数指定匹配的字符、字符集或表达式重复出现的次数。下面是一些常用的重复次数:

*:匹配前一个字符、字符集或表达式零次或多次。

+:匹配前一个字符、字符集或表达式一次或多次。

?:匹配前一个字符、字符集或表达式零次或一次。

{n}:匹配前一个字符、字符集或表达式恰好出现 n 次。

{n,m}:匹配前一个字符、字符集或表达式出现 n 到 m 次。

# 匹配一个由数字组成的手机号码
import re

str = "13912345678"
pattern = '1[345789]\d{9}'
result = re.findall(pattern, str)
print(result)
输出结果:
['13912345678']

二、正则表达式的元字符

2.1. 点号(.)

点号可以匹配任意一个字符,除了换行符。例如,用正则表达式 .o 匹配 foobar 可以得到 foo。

# 匹配一个以o结尾的单词
import re

str = "hello world\nfoo\nbar\n"
pattern = r'\w+o\b'
result = re.findall(pattern, str, re.M)
print(result)
输出结果:
['world', 'foo']

2.2. 问号(?)

问号可以将紧挨着它前面的字符、字符集或表达式匹配零次或一次。例如,用正则表达式 colou?r 匹配 color 或 colour 都可以。

# 匹配一个以www开头的URL地址
import re

str = "http://www.google.com"
pattern = r'www\..+?\.(com|cn)'
result = re.findall(pattern, str)
print(result)
输出结果:
['google.com']

2.3. 星号(*)和加号(+)

星号和加号用于指定前面的字符、字符集或表达式可以重复出现的次数。星号表示可以出现零次或多次,加号表示可以出现一次或多次。例如,用正则表达式 ab*c 匹配 ac、abc、abbc、abbbc 等字符串,用正则表达式 ab+c 匹配 abc、abbc、abbbc 等字符串。

# 检查一个IP地址的合法性
import re

ip = "192.168.1.1"
pattern = r'\d+\.\d+\.\d+\.\d+'
result = re.match(pattern, ip)
if result:
    print("Valid IP address")
else:
    print("Invalid IP address")
输出结果:
Valid IP address

三、常用的正则表达式操作

3.1. 查找匹配的字符串

可以使用re模块的 search()、match()、findall() 方法查找匹配的字符串。其中 search() 方法从头开始搜索,如果找到第一个匹配项就返回,而 match() 方法只能从头开始匹配,如果不是以指定的字符串开头,就返回 None。findall() 方法可以搜索整个字符串,返回所有满足条件的字符串。

# 查找一个包含数字的字符串
import re

str = "The number is 123456"
pattern = r'\d+'
result = re.search(pattern, str)
if result:
    print(result.group())
else:
    print("Not found")
输出结果:
123456

3.2. 替换字符串

可以使用 re.sub() 方法替换匹配的字符串。该方法的第一个参数是正则表达式,第二个参数是要替换成的字符串,第三个参数是要搜索的字符串。

# 将一个字符串中的空格替换为下划线
import re

str = "The quick brown fox jumps over the lazy dog"
pattern = r'\s+'
result = re.sub(pattern, '_', str)
print(result)
输出结果:
The_quick_brown_fox_jumps_over_the_lazy_dog

3.3. 分割字符串

可以使用 re.split() 方法将字符串按指定的正则表达式进行分割,以列表形式返回划分后的子串。

# 分割一个由逗号和空格组成的字符串
import re

str = "a, b, c"
pattern = r',\s'
result = re.split(pattern, str)
print(result)
输出结果:
['a', 'b', 'c']

总结:

Python自带的re模块提供了强大的正则表达式操作。本文介绍了Python正则表达式的基本语法、常用的元字符和重复次数,以及常用的正则表达式操作,如查找匹配的字符串、替换字符串和分割字符串等。熟练掌握这些必备技巧,可以快速地对字符串进行处理和分析。