Python中re负责通过正则表达式处理字符串,使用正则前我们需要先import re
import re
1.常用函数介绍
函数 | 解释 | 返回结果 |
---|---|---|
match | 从string开头匹配并返回第一个成功的匹配 | 对象,通过Match对象内的group编号或命名,获得对应的值 |
search | 扫描整个字符串并返回第一个成功的匹配 | 对象,通过Match对象内的group编号或命名,获得对应的值 |
findall | 扫描整个字符串并返回所有成功的匹配 | 一个列表 |
1.1 match<较不常用>
- 从开始位置开始往后查找,返回第一个符合规则的对象,如果第一行开头没有匹配到数据则返回 None
- 在多行模式下,只匹配第一行开头的的,而不会匹配每一行的开头
- match匹配到数据后返回的是一个对象
# 示例 1
string = '123abc123\n123fff'
result = re.match(r'123', string )
print (result.group())
-----------------------
123
# 示例 2
string = 'abc123\n123fff'
result = re.match(r'123', string)
print (result)
-----------------------
None
# 示例 3
pattern = re.compile(r'\d+') #后面会介绍compile,其负责生成一个正则表达式对象
result = pattern.match('123ab123bbb456')
print (result.group())
-----------------------
123
# 示例 4
pattern = re.compile(r'\d+') #此处加r表示不转义字符串
result = pattern.match('ab123bbb456', 2,5) # 2,5表示开始&结束识别位置,可以只有开始识别位置
print (result.group())
-----------------------
123
1.2 search<较不常用>
- search()方法和match()类似
- 与search方法不同的是可换行匹配,也就是可全文匹配
# 示例
pattern = re.compile(r'\d+') #此处加r表示不转义字符串
result = pattern.search('ab123bbb456')
print (result.group())
-----------------------
123
1.3 findall<最常用>
- 可换行匹配,也就是可全文匹配
- 返回所有符合要求匹配
- 返回结果是一个list
- 当正则表达式加上括号时,返回结果会优先显示括号内匹配到的内容
- 如果不想要优先显示括号内匹配到的内容,可以在括号内顶格加上'?:' 例如:(?:正则表达式)
pattern = re.compile(r'\d+')
result = pattern.findall('ab123bbb456\n7654')
print (resullt)
-----------------------
['123', '456', '7654']
1.4 compile
compile 函数用于编译正则表达式,生成一个正则表达式对象,供 match() 、search() 、findall()等函数使用(如上面示例)
语法格式为:
re.compile(pattern[, flags])
pattern : 一个字符串形式的正则表达式,具体下面会详细介绍
flags : 可选标志位,表示匹配模式,比如忽略大小写,多行模式等,具体参数下面会详细介绍
2.1 flags : 可选标志位
w | w |
---|---|
re.A | ASCII,使得 \w,\W,\b,\B,\s 和 \S 只匹配 ASCII 字符,而不匹配完整的 Unicode 字符。这个标志仅对 Unicode 模式有意义,并忽略字节模式。 |
re.I | IGNORECASE,字符类和文本字符串在匹配的时候不区分大小写 |
re.L | LOCALE,使得 \w,\W,\b 和 \B 依赖当前的语言(区域)环境,而不是 Unicode 数据库 |
re.M | MULTILINE,通常 ^ 只匹配字符串的开头,而 $ 则匹配字符串的结尾。当这个标志被设置的时候,^ 不仅匹配字符串的开头,还匹配每一行的行首;& 不仅匹配字符串的结尾,还匹配每一行的行尾。 |
re.S | DOTALL,使 . 匹配包括换行符在内的所有字符 |
re.X | VERBOSE,这个标志使你的正则表达式可以写得更好看和更有条理,因为使用了这个标志,空格会被忽略(除了出现在字符类中和使用反斜杠转义的空格);这个标志同时允许你在正则表达式字符串中使用注释,# 符号后边的内容是注释,不会递交给匹配引擎(除了出现在字符类中和使用反斜杠转义的 #)。 |
可以同时使用多个标志位,方法:re.search( r'正则表达式', '字符串', re.M|re.I)
2.2 pattern: 特殊字符
w | w |
---|---|
\d | 匹配任何十进制数字;相当于类 [0-9] |
\D | 与 \d 相反,匹配任何非十进制数字的字符;相当于类 [^0-9] |
\s | 匹配任何空白字符(包含空格、换行符、制表符等);相当于 [ \t\n\r\f\v] |
\S | 匹配任何非空白字符;相当于类 [^\t\n\r\f\v] |
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字及下划线 |
\b | 匹配单词的开始或结束 |
\B | 匹配非单词边界 |
2.3 pattern: 元字符
w | w |
---|---|
| | 或操作符,a | b匹配a或b |
^ | 匹配字符串的开头,如果设置了 MULTILINE 标志,就会变成匹配每一行的起始位置。 |
$ | 匹配字符串的末尾。如果设置了 MULTILINE 标志,就会变成匹配每一行的结束位置。 |
. | 匹配任意字符,除了换行符,如果设置了DOTALL标志,则可以匹配包括换行符的任意字符: re.compile("(.+)", re.DOTALL) |
[abc] | 匹配括号中的a,b,c任意单个字符,而不是abc字符串 |
[^abc] | 匹配除了a,b,c之外的任意字符 |
* | 匹配前一个字符0次或多次 |
+ | 匹配前一个字符1次或多次 |
? | 匹配前一个字符0次或1次 |
{n} | 精确匹配前一个字符 n次,例如a{3}b,可以匹配aaab |
{,n} | 匹配前一个字符0次到n次 |
{n,} | 匹配前一个字符 n次到无限次 |
{m,n} | 匹配前一个字符 m 到 n 次 |
\1...\9 | 匹配第n个分组的内容。(abc)小括号括起来的为一组\1匹配第一个小括号的组... |
2.4 pattern: 其他字符
w | w |
---|---|
[\u4E00-\u9FA5] | 中文 |
3 使用心得
3.1 贪婪 VS 非贪婪
未完待续