python的正则
正则最重要:
1:元字符:
元字符在匹配自身时,是不会与自身字符意思相等,例如. 不等于字符. 需要加\.转义才能表示是字符串
. ^ $ * + ? { [ ] \ | ( )
[ ]通常用来表示区间,[abc] 将匹配"a", "b", 或 "c"中的任意一个字符;也可以用区间[a-c]来表示同一字符集,和前者效果一致。如果你只想匹配小写字母,那么 RE 应写成 [a-z].
用 "\" 开始的特殊字符所表示的预定义字符集通常是很有用的,象数字集,字母集,或其它非空字符集。下列是可用的预设特殊字符:
\d 匹配任何十进制数;它相当于类 [0-9]。 记忆:digital == d \D 匹配任何非数字字符;它相当于类 [^0-9]。 \s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。记忆:space == s \S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。 \w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。 记忆:word == w \W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。
*表示0或者多次
+表示1或者多次
?表示0或者1次
{m,n}:至少有 m 个重复,至多到 n 个重复
可以忽略 m 或 n;因为会为缺失的值假设一个合理的值。忽略 m 会认为下边界是 0,而忽略 n 的结果将是上边界为无穷大
\反斜杠的问题。如果匹配字符是"\dog",就上面\d代表数字,这里就开始有歧义了,所以\需要用反斜杠来转义自己
这里表达式就写为"\\dog"了,还可以使用r令字符串内一个或者多个反斜杠不转义 所以表达式可以这样r"\dog"
2:匹配方法
| 方法 | 作用 |
| match() |
re.match(pattern, string[, flags]) 从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾 |
| search() |
re.search(pattern, string[, flags]) 若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果string中存在多个pattern子串,只返回第一个。 flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 |
| findall() | 找到 RE 匹配的所有子串,并把它们作为一个列表返回 |
| finditer() | 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回 |
1:使用正则,先生产一个re的表达式
>>> import re
>>> p = re.compile('[a-z]+')
matchobject
import re
#re.compile("表达式"),返回一个正则表达式的对象
p = re.compile("[abc]+")
print(p)
#返回一个matchobject的实例
m=p.match("abbbbcsdd")
print(m.group())
print(m.start())
print(m.end())
print(m.span())
#结果
re.compile('[abc]+')
abbbbc
0
6
(0, 6)
match对象的方法:
| 方法/属性 | 作用 |
|---|---|
| group() | 返回被 RE 匹配的字符串 |
| start() | 返回匹配开始的位置 |
| end() | 返回匹配结束的位置 |
| span() | 返回一个元组包含匹配 (开始,结束) 的位置 |
match对象在实际程序中,最常见的作法是将 MatchObject 保存在一个变量里,然後检查它是否为 None
import re
#re.compile("表达式"),返回一个正则表达式的对象
p = re.compile("[abc]+")
print(p)
#返回一个matchobject的实例
m=p.match("abbbbcsdd")
if m:
print("匹配到")
else:
print("没有匹配到")
边界匹配:
^ 匹配字符串的开头
$ 匹配字符串的结尾
分组匹配:
(表达式1),(表达式2) 对应match对象的group(1),group(2)
import re
#!/usr/bin/python
import re
s = "asa are 1223 adfasdf"
matchObj = re.match( '(\w+) are (\d+) .*', s, re.M|re.I)
if matchObj:
print("matchObj.group() : ", matchObj.group())#sa are 1223 adfasdf
print("matchObj.group(1) : ", matchObj.group(1))#asa
print("matchObj.group(2) : ", matchObj.group(2))#1223
else:
print("No match!!")
| 或者匹配,先匹配左边,一旦成功匹配,则跳过右边的表达式,如果|没有被包括到()中,他的范围是整个表达式
b = '22asdfjk22'
b = re.match('[a-z]+|\d+',b)
print(b.group())#22

浙公网安备 33010602011771号