python 正则表达式
一、使用re模块
import re
1.re.search(pattern, string, flags=0)
- re.search:扫描整个字符串并返回第一个成功的匹配
result = re.search(pattern, string, flags=0)
返回一个编译后的re.Match对象,对象的常用方法有:
- result .group(num=0)
- 返回分组第num组的值,0表示返回全部
- result .start()
- 返回第一个成功匹配的索引
- result .end()
- 返回最后一个匹配的索引
- result .span()
- 返回一个元组:(第一个成功匹配的索引, 最后一个匹配的索引)
例:
a3 = r'\.([a-z]*)\.(.*)\.'
result = re.search(a3, 'www.czy.czy12as123d.com')
print(result)
print(result.group())
print(result.group(2))
print(result.start())
print(result.end())
print(result.span())
执行结果:
<re.Match object; span=(3, 20), match=’.czy.czy12as123d.’>
.czy.czy12as123d.
czy12as123d
3
20
(3, 20)
2.re.match(pattern, string, flags=0)
- re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
result = re.match(pattern, string, flags=0)
返回一个编译后的re.Match对象,对象的常用方法有:
- result .group(num=0)
- 返回分组后第num组的值,0表示返回正则的全部匹配
- result .start()
- 返回第一个成功匹配的索引
- result .end()
- 返回最后一个匹配的索引
- result .span()
- 返回一个元组:(第一个成功匹配的索引, 最后一个匹配的索引)
例:
a1 = r'.*y(\d*)as(\d*).*m$'
a2 = r'www\.czy\..*com$'
a3 = r'\.([a-z]*)\.(.*)\.'
a4 = r'\.czy(\d+).*'
a5 = r'\d+'
result = re.match(a1, 'www.czy.czy12as123d.com')
print(result)
print(result.group())
print(result.group(2))
print(result.start())
print(result.end())
print(result.span())
执行结果:
<re.Match object; span=(0, 23), match=‘www.czy.czy12as123d.com’>
www.czy.czy12as123d.com
123
0
23
(0, 23)
3.re.findall(pattern, string, flags=0)
- 返回字符串中所有非重叠匹配项的列表。
如果模式中存在一个或多个捕获组,则返回
组的列表;这将是一个元组列表。
result = re.findall(pattern, string, flags=0)
例:
a1 = r'.*y(\d*)as(\d*).*m$'
a2 = r'www\.czy\..*com$'
a3 = r'\.([a-z]*)\.(.*)\.'
a4 = r'\.czy(\d+).*'
a5 = r'\d+'
result = re.findall(a3, 'www.czy.czy12as123d.com')
result1 = re.findall(a5, 'www.czy.czy12as123d.com')
print(result)
print(result1)
执行结果:
[(‘czy’, ‘czy12as123d’)]
[‘12’, ‘123’]
4.re.finditer(pattern, string, flags=0)
- 和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
- 遍历这个可迭代对象返回一个编译后的re.Match对象
result = re.finditer(pattern, string, flags=0)
re.Match对象的常用方法有:
- result .group(num=0)
- 返回分组第num组的值,0表示返回全部
- result .start()
- 返回第一个成功匹配的索引
- result .end()
- 返回最后一个匹配的索引
- result .span()
- 返回一个元组:(第一个成功匹配的索引, 最后一个匹配的索引)
例:
result = re.finditer(a3, 'www.czy.czy12as123d.com')
for i in result:
print(i.group())
print(i.group(2))
print(i.start())
print(i.end())
print(i.span())
执行结果:
.czy.czy12as123d.
czy12as123d
3
20
(3, 20)
5.re.split(pattern, string, maxsplit=0, flags=0)
- split 方法按照能够匹配的子串将字符串分割后返回列表
- maxsplit表示最大分割次数,0表示不限次数
result = re.split(pattern, string, maxsplit=0, flags=0)
例:
a5 = r'\d+'
result = re.split(pattern=a5, string='www.czy.czy12as123d.com', maxsplit=0)
print(result)
执行结果:
[‘www.czy.czy’, ‘as’, ‘d.com’]
6.re.compile(pattern, flags=0)
- 编译一个正则表达式模式,返回一个模式对象
pat= re.compile(pattern, flags=0)
模式对象的方法有(这些方法除了增加步长之外跟re直接调用没有什么区别):
- pat.search(string, pos, endpos)
- pat.match(string, pos, endpos)
- pat.findall(string, pos, endpos)
- pat.split(string, pos, endpos)
- pat.finditer(string, pos, endpos)
注:pat= re.compile(pattern, flags=0) 返回_compile(pattern, flags)方法,该方法经过编译返回re.Pattern对象。而我们直接使用re.findall()的返回值是_compile(pattern, flags).findall(string),说明还是通过re.Pattern这个对象调用他的方法,只不过默认步长是从头取到尾。
例:
a1 = r'.*y(\d*)as(\d*).*m$'
a2 = r'www\.czy\..*com$'
a3 = r'\.([a-z]*)\.(.*)\.'
a4 = r'\.czy(\d+).*'
a5 = r'\d+'
pat = re.compile(a5)
result = pat.findall('www.czy.czy12as123d.com', 12, 18)
print(result)
执行结果:
[‘2’, ‘123’]
二、常用的正则表达式
模式 | 描述 |
---|---|
[A-Z] | [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。 |
[a-z] | 匹配任何小写字母 |
[0-9] | 匹配任何数字。类似于 [0123456789] |
[a-zA-Z0-9] | 匹配任何字母及数字 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
\w | 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] |
\d | 匹配任意数字,等价于 [0-9]. |
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 \|。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |