【Python】正则表达式及其在Python中的应用
1.正则表达式基本格式
1. 字符匹配
- 普通字符:直接匹配字符本身,如
a匹配字符a。 - 特殊字符:需要转义,如
\.匹配点号.。
2. 量词
\*:匹配前面的字符零次或多次,如a*匹配""、"a"、"aa"等。+:匹配前面的字符一次或多次,如a+匹配"a"、"aa"等。?:匹配前面的字符零次或一次,如a?匹配""、"a"。{m}:匹配前面的字符恰好m次,如a{3}匹配"aaa"。{m,n}:匹配前面的字符至少m次,至多n次,如a{2,4}匹配"aa"、"aaa"、"aaaa"。
3. 字符集
[abc]:匹配方括号内的任意一个字符,如[abc]匹配"a"、"b"、"c"。[^abc]:匹配不在方括号内的任意一个字符,如[^abc]匹配除了"a"、"b"、"c"之外的任何字符。[a-z]:匹配从a到z的任意一个小写字母。[0-9]:匹配从0到9的任意一个数字。
4. 预定义字符集
.:匹配除换行符外的任意单个字符。\d:匹配一个数字,等同于[0-9]。\D:匹配一个非数字,等同于[^0-9]。\w:匹配一个字母、数字或下划线,等同于[a-zA-Z0-9_]。\W:匹配一个非字母、数字或下划线,等同于[^a-zA-Z0-9_]。\s:匹配一个空白字符(包括空格、制表符、换页符等)。\S:匹配一个非空白字符。
5. 边界匹配
^:匹配字符串的开头。$:匹配字符串的结尾。\b:匹配单词边界。\B:匹配非单词边界。
2.re库:正则表达式在Python中的应用
1. re.match(pattern, string)
-
功能:从字符串的开头开始匹配,如果匹配成功返回一个匹配对象,否则返回
None。 -
示例
import re pattern = r'^Hello' text = 'Hello, world!' match = re.match(pattern, text) if match: print('Match found:', match.group()) else: print('No match')
2. re.search(pattern, string)
-
功能:在字符串中搜索第一个匹配项,如果找到返回一个匹配对象,否则返回
None。import re pattern = r'world' text = 'Hello, world!' match = re.search(pattern, text) if match: print('Match found:', match.group()) else: print('No match')
3. re.findall(pattern, string)
-
功能:返回字符串中所有与模式匹配的子串,作为一个列表。
-
示例
import re pattern = r'\d+' text = 'There are 123 apples and 456 oranges.' matches = re.findall(pattern, text) print('Matches found:', matches)
!这个是比较常用到的一个方法
比如LeetCode(力扣)的8. 字符串转换整数 (atoi):
请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。
函数 myAtoi(string s) 的算法如下:
- **空格:**读入字符串并丢弃无用的前导空格(
" ") - **符号:**检查下一个字符(假设还未到字符末尾)为
'-'还是'+'。如果两者都不存在,则假定结果为正。 - **转换:**通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
- **舍入:**如果整数数超过 32 位有符号整数范围
[−231, 231 − 1],需要截断这个整数,使其保持在这个范围内。具体来说,小于−231的整数应该被舍入为−231,大于231 − 1的整数应该被舍入为231 − 1。
返回整数作为最终结果。
示例 1:
**输入:**s = “42”
**输出:**42
**解释:**加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
带下划线线的字符是所读的内容,插入符号是当前读入位置。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:"42"(读入 "42")
^
示例 2:
**输入:**s = " -042"
输出:-42
解释:
第 1 步:" -042"(读入前导空格,但忽视掉)
^
第 2 步:" -042"(读入 '-' 字符,所以结果应该是负数)
^
第 3 步:" -042"(读入 "042",在结果中忽略前导零)
^
示例 3:
**输入:**s = “1337c0d3”
**输出:**1337
解释:
第 1 步:"1337c0d3"(当前没有读入字符,因为没有前导空格)
^
第 2 步:"1337c0d3"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:"1337c0d3"(读入 "1337";由于下一个字符不是一个数字,所以读入停止)
^
示例 4:
**输入:**s = “0-1”
**输出:**0
解释:
第 1 步:"0-1" (当前没有读入字符,因为没有前导空格)
^
第 2 步:"0-1" (当前没有读入字符,因为这里不存在 '-' 或者 '+')
^
第 3 步:"0-1" (读入 "0";由于下一个字符不是一个数字,所以读入停止)
^
示例 5:
**输入:**s = “words and 987”
**输出:**0
解释:
读取在第一个非数字字符“w”处停止。
提示:
0 <= s.length <= 200s由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-'和'.'组成
如果类似的题目出现在竞赛中,我们可以用正则表达式来轻松解决
import re
return max(min(int(*re.findall('^[\+\-]?\d+', s.lstrip())), (1<<31)-1), -(1<<31))
不过在平时练习中还是用正常思路来做以达到练习的效果
4. re.sub(pattern, repl, string)
-
功能:将字符串中所有与模式匹配的子串替换为指定的字符串。
-
示例
import re pattern = r'\d+' text = 'There are 123 apples and 456 oranges.' result = re.sub(pattern, 'X', text) print('Result:', result)
5. re.split(pattern, string)
-
功能:根据模式将字符串分割成一个列表。
-
示例
import re pattern = r'\s+' text = 'Hello world! How are you?' parts = re.split(pattern, text) print('Parts:', parts)
6. re.compile(pattern)
-
功能:编译正则表达式,返回一个正则表达式对象,可以用于多次匹配。
-
示例
import re pattern = re.compile(r'\d+') text = 'There are 123 apples and 456 oranges.' matches = pattern.findall(text) print('Matches found:', matches)
3.结语
本人资历尚浅,发博客主要是记录与学习,欢迎大佬们批评指教!大家也可以在评论区多多交流,相互学习,共同成长。










