使用正则表达式前移除空白:使用re.sub(r'\s+', '', text)替换strip()以确保移除所有空白字符。
正则表达式(Regular Expression,简称regex或regexp)是一种用于匹配字符串中字符组合的模式。它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在Python中,正则表达式通过re
模块提供,这个模块包括各种功能强大的方法来处理字符串。
以下是一些基本的正则表达式用法的详解:
1. 导入模块
在使用正则表达式之前,需要先导入Python的re
模块。
import re
2. 基本匹配
使用re.match()
来检查字符串是否从开始就符合正则表达式。
# 检查字符串是否完全匹配正则表达式
match = re.match(r'^\d+$', '12345') # 匹配成功,返回一个Match对象
if match:
print("匹配成功")
else:
print("匹配失败")
3. 搜索
使用re.search()
来搜索字符串中首次出现的匹配项。
# 搜索字符串中首次出现的匹配项
search = re.search(r'\d+', 'Hello 123, how are you?')
if search:
print("找到匹配项:", search.group())
4. 查找所有匹配
使用re.findall()
来找出字符串中所有匹配的项。
# 查找字符串中所有匹配的项
findall = re.findall(r'\d+', '123, 456, 7890')
print("所有匹配项:", findall)
5. 替换
使用re.sub()
来替换字符串中的匹配项。
# 替换字符串中的匹配项
sub = re.sub(r'\d+', 'XXX', 'Hello 123, goodbye 456')
print("替换后的字符串:", sub)
6. 分割
使用re.split()
来根据正则表达式分割字符串。
# 根据正则表达式分割字符串
split = re.split(r'\s+', 'Hello 123, goodbye 456 world')
print("分割后的字符串列表:", split)
7. 编译正则表达式
如果需要多次使用相同的正则表达式,可以先编译它以提高效率。
# 编译正则表达式
pattern = re.compile(r'\d+')
result = pattern.findall('123 456 789')
print("编译后的匹配项:", result)
8. 正则表达式的特殊字符
-
.
:匹配任意单个字符(除了换行符)。 -
^
:匹配字符串的开始。 -
$
:匹配字符串的结束。 -
*
:匹配前面的字符零次或多次。 -
+
:匹配前面的字符一次或多次。 -
?
:匹配前面的字符零次或一次。 -
{m,n}
:匹配确定的次数值。 -
[]
:匹配括号内的任意字符。 -
|
:逻辑或操作符。 -
\
:转义特殊字符或表示特殊序列。
9. 正则表达式中的断言
-
(?=...)
:正向前瞻断言,匹配...前面的位置。 -
(?!...)
:负向前瞻断言,匹配除了...之外的前面的位置。 -
(?<=...)
:正向后瞻断言,匹配...后面的位置。 -
(?<!...)
:负向后瞻断言,匹配除了...之外的后面的位置。
10. 捕获组
使用圆括号()
来创建捕获组,以便从匹配项中提取子模式。
# 使用捕获组提取信息
pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')
match = pattern.match('Today is 2023-07-22')
if match:
print("捕获的年份:", match.group(1))
print("捕获的月份:", match.group(2))
print("捕获的日期:", match.group(3))
正则表达式是一种用于匹配字符串中字符组合的模式,广泛应用于文本处理、搜索和数据验证等领域。以下是正则表达式的一些基础用法和高级技巧的详解:
基础概念
-
字符匹配:
- 普通字符:直接匹配自身,如
a
匹配字符a
。 - 特殊字符:具有特殊含义,如
.
匹配任意单个字符(除了换行符)。
- 普通字符:直接匹配自身,如
-
字符类:
- 使用
[]
定义,匹配括号内的任意一个字符,如[abc]
匹配a
、b
或c
。 - 范围表示法:如
[a-z]
匹配任意小写字母。
- 使用
-
重复:
-
*
:匹配前面的元素零次或多次。 -
+
:匹配前面的元素一次或多次。 -
?
:匹配前面的元素零次或一次。 -
{n}
:精确匹配n次。 -
{n,}
:至少匹配n次。 -
{n,m}
:匹配n到m次。
-
-
位置指定:
-
^
:匹配字符串的开始。 -
$
:匹配字符串的结束。
-
-
选择:
-
|
:逻辑或操作符,如cat|dog
匹配cat
或dog
。
-
高级用法
-
分组:
- 使用圆括号
()
创建捕获组,允许你捕获和引用匹配的文本片段。
- 使用圆括号
-
量词修饰符:
-
*?
、+?
、??
:非贪婪量词,尽可能少地匹配字符。 -
*+
、++
、?+
:占有量词,不允许反向回溯。
-
-
断言:
-
(?:...)
:非捕获组,用于组织模式但不捕获文本。 -
(?=...)
:正向前瞻断言,确保某个位置后面能匹配某个模式。 -
(?!...)
:负向前瞻断言,确保某个位置后面不能匹配某个模式。 -
(?<=...)
:正向后瞻断言,确保某个位置前面能匹配某个模式。 -
(?<!...)
:负向后瞻断言,确保某个位置前面不能匹配某个模式。
-
-
字符转义:
- 使用反斜杠
\
转义特殊字符或表示特殊序列,如\n
表示换行符。
- 使用反斜杠
-
特殊序列:
-
\d
:匹配任意数字,等价于[0-9]
。 -
\w
:匹配任意字母数字字符,等价于[a-zA-Z0-9_]
。 -
\s
:匹配任意空白字符。
-
-
编译正则表达式:
- 使用
re.compile()
编译正则表达式,提高效率,适用于多次使用同一模式。
- 使用
-
Python中的正则表达式函数:
-
re.search()
:搜索字符串,返回第一个匹配的对象。 -
re.match()
:从字符串的开始位置匹配模式。 -
re.findall()
:找出字符串中所有匹配的子串,并返回列表。 -
re.finditer()
:返回一个迭代器,每次迭代返回一个Match对象。 -
re.sub()
:替换字符串中的匹配项。 -
re.split()
:根据匹配的模式分割字符串。
-
示例
import re
# 基础匹配
pattern = r'\d+'
text = 'The year is 2023 and the temperature is 25 degrees.'
matches = re.findall(pattern, text)
print(matches) # 输出:['2023', '25']
# 使用捕获组
pattern = r'(\d{4})-(\d{2})-(\d{2})'
text = 'Today is 2023-07-22.'
match = re.match(pattern, text)
if match:
print(match.group(1)) # 输出年份
print(match.group(2)) # 输出月份
print(match.group(3)) # 输出日期
# 非贪婪匹配
pattern = r'<.*?>'
text = '<div><p>Example</p></div>'
tags = re.findall(pattern, text)
print(tags) # 输出:['<div>', '<p>']
# 正向前瞻断言
pattern = r'\b(?<=from)\w+\b'
text = 'Send the data from the server.'
matches = re.findall(pattern, text)
print(matches) # 输出:['server']
正则表达式是一种非常强大的工具,可以用于文本处理、数据清洗、网络爬虫等多种场景,但也需要仔细设计以确保正确性和效率。应根据具体需求选择合适的模式和方法,掌握正则表达式的使用可以大大提高开发效率。