【Python】正则表达式及其在Python中的应用
【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 <= 200
s
由英文字母(大写和小写)、数字(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.结语
本人资历尚浅,发博客主要是记录与学习,欢迎大佬们批评指教!大家也可以在评论区多多交流,相互学习,共同成长。