Python中re模块中的match方法:
字符 | 单字符匹配 |
. | 匹配任意字符(除了\n) |
[...] | 匹配字符集 |
\d \D | 匹配任意数字,匹配任意非数字 |
\s \S | 匹配空白字符,匹配非空白字符 |
\w \W | 匹配单词字符[a-zA-Z0-9],匹配任意非单词字符 |
举例:
- 匹配大括号中及其有一个字符的字符串:{a}
{.}
- 匹配大括号中及其中有字符集 z1s 的任意一个字符:{z}
{[z1s]}
- 匹配大括号中及其中有字符集 a-zA-Z0-9的任意一个字符:{n}
{[a-zA-Z0-9]},又可写成:{[\w]}
- 匹配中括号及该中括号内存在一个单词字符:[a]
\[[\w]\],需要加转义符号(这里贴个图,被转义了)
字符 | 多字符匹配 |
* | 匹配前一个字符0次或者无限次 |
+ | 匹配前一个字符1次或者无限次 |
? | 匹配前一个字符0次或者1次 |
{m} {m,n} | 匹配前一个字符m次,匹配前一个字符m-n次 |
*? +? ?? | 匹配模式变为非贪婪(尽可能减少匹配字符,即分别匹配0、1、0次) |
举例:
- 匹配一个字符串开头是大写字母,后面跟着 >=0 个小写字母:Zhangfeng
[A-Z][a-z]*
- 匹配一个Python变量名是否有效(开头可以是_和字母,不可以是数字)
[_a-zA-Z]+[_\w]*
- 匹配0-99中任意数字,其中 01-09 该形式不对
[1-9]?[0-9],该写法匹配 05 形式时,结果是0,[1-9]? 表示1-9可以出现0-1次, 而09前面没有出现1-9,再匹配第二个[0-9],便匹配上了0;即[1-9]?[0-9]可匹配的字符串大小是1-2(python中match方法是从头开始匹配,匹配到开头那个是符合正则表达式,则给出正确的返回值)
- 匹配@前面有6-9个字符的qq邮箱
[a-zA-Z0-9]{6,9}@qq.com
- 用正则表达式 [0-9][a-z]* 匹配字符串 3bc 时,结果为3bc
用正则表达式 [0-9][a-z]*? 匹配字符串 3bc 时,结果为3
用正则表达式 [0-9][a-z]+? 匹配字符串 3bc 时,结果为3b
用正则表达式 [0-9][a-z]?? 匹配字符串 3bc 时,结果为3
字符 | 边界匹配 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\A \Z | 指定的字符串必须出现在开头,/结尾 |
举例:
- 匹配正确的邮箱格式:@前面有6-9个字符
^[\w]{6,9}@qq.com$,上述匹配@前面有6-9个字符的qq邮箱正则表达式 [a-zA-Z0-9]{6,9}@qq.com,匹配字符串 1236545@qq.comabc 时,亦可得到结果:1236545@qq.com
- 匹配以字符串 imooc 开头的字符串
\Aimooc[\w]*
字符 | 分组匹配 |
| | 匹配左右任意一个表达式 |
(a,b) | 括号中表达式作为一个分组 |
\<number> | 引用编号为number的分组匹配到的字符串 |
(?P<name>) | 分组起一个别名 |
(?P=name) | 引用别名为name的分组匹配字符串 |
举例:
- 匹配 0-99 或者 100:
[0-9]?\d$|100
- 匹配@前有6-9个字符的 qq邮箱 或者 gmail 邮箱 或者 163邮箱:
[\w]{6,9}@(qq|163|gmail).com
- 匹配XML格式,如有:<book>python</book>
<[\w]+>,匹配<book>,结果:<book>
<([\w]+>),匹配<book>,结果:< book>,其中 <([\w]+>)\0 为:<, <([\w]+>)\1 为:book>
<([\w]+>)\1,匹配<book>book>,结果为:<book>book>,
<([\w]+>)[\w]+</\1 或者写成 <(?P<mark>[\w]+>)[\w]+</(?P=mark),匹配<book>python</book>,结果:<book>python</book>
Python其他方法:
# search(pattern, string, flags=0)
# 在一个字符串中查找匹配
# 查找字符串中的数字
str = "imooc videonum = 1000"
result = str.search(r'\d+', str)
# result = '1000'
# findall(pattern, string, flags=0)
# 找到匹配,返回所有匹配部分的列表
# 查找字符串中的所有数字
str2 = "c++ = 100, java = 55, python = 80"
result = str.findall(r'\d+', str)
# result = ['100', '55', '80']
# split(pattern, string, maxsplit=0, flags=0) :
# 根据匹配分割字符串,返回分割字符串组成的列表
# 拆分字符串str = "Imooc:C C++ Java Python, C#",成各门课程列表
str = "Imooc:C C++ Java Python, C#"
re.split(r':| |,', str)
# 返回结果:['Imooc', 'C', 'C++', 'Java', 'Python', 'C#']
# sub(pattern, repl, string, count=0, flags=0)
# 将字符串中匹配正则表达式的部分替换为其他值
# 使查找到的字符串其数字部分自动加1
def add(match):
val = match.group()
num = int(val) + 1
return str(num)
str = "imooc videonum = 999"
re.sub(r'\d+', add, str) # re.sub
# 返回结果: str = "imooc videonum = 1000"
转载请注明出处