正则语法学习日志
一、语法
普通字符:r‘xxx’(xxx表示字符,就是在内容中查找所有xxx,返回字符)
元字符:
“.”:通配符,匹配所有的字符。
“*”:重复符1,表示字符重复任意次,包括0次。
比如:r‘我.*’就是匹配以我开头所有的字符(包括我)。
“+”:重复符2,和“*”作用相同·,但是不包括0次。
比如:content = ‘’’<head><title><\title><\head>’’’中
r’<.*>’和r‘<.+>’都可以匹配到整个语句,返回为字符串。
注:为什么匹配的不是一个分别包含[<head>,<title>,<\title>,<\head>]的列表?因为*和+默认是贪婪模式,就是在符合要求的情况下,尽可能长地匹配。
如果要换成非贪婪模式,可以在后面加上一个问号,r‘<,*?>’和r‘<.+?>’就会尽可能少地去匹配。
“?”:匹配0次或者一次。
“{}”:指定次数,次数只能是在0~9次,主要应用在提取电话号码等固定了格式的数字或者其他比较固定的字符串。如果有两个,就是匹配一个范围。
{2,4}是匹配重复2到4次的。
{2,}是匹配至少重复2次的。
比如:
Content = “””周XX,号码18012345678
刘XX,号码18912345678
张XX,18112345678“””
r’号码\d{2,}’就可以匹配到刘XX的号码。
“\”:转义字符,当正则语句中需要使用原意的元字符的时候,可以使用转义字符
比如需要匹配小数的时候:
Content = “””1.12345678
2.12345678
3.12345678“””
需要使用这样的正则语句:r‘\..*’,其中第一个“\.”是指的原文中的‘.’,而不是正则语句元字符。
注:“\”还可以匹配特殊的类型,比如:
\d,匹配0~9中的任意一个数字字符,等价于[0-9]
\D,匹配不是0~9中的任意一个数字字符,等价于[0-9](其实我感觉有点奇怪...0~9不是包含了所有个位数字吗)。
\s,匹配空白字符,包括空格符制表符等等。
\S,匹配非空白字符。
\w,匹配任意文字字符,包括大小写字母,数字,下划线,等价于[a-zA-Z0-9]
\W,匹配一个非文字字符,等价于[^a-zA-Z0-9]
注:注意断句啊!!
我发现了自己理解错误...\D,是匹配不是(0~9中的任意一个数字)字符,而不是匹配(不是0~9中)的数字字符。也就是说,\D是可以匹配除了数字外的所有其他字符,和\d是补集的关系!同理,\W和\w、\S和\s也是这样。
例如:content = “””刘XX
钟XX
Mike““”中需要匹配名字,就可以用r’\w{2,4}’和r’\S{2,4}’
如果要匹配英文可以加上ASCII参数
“[]”:字符集合,就是可以匹配其中包含的任意的字符,字母和字符在其中可以用范围。
2、分组
当我们匹配一些内容,又不需要其中的匹配特征的时候,比如上面匹配电话号码,我们并不需要前面的“号码”,只想匹配后面的数字。
Content = “””周XX,号码18012345678
刘XX,号码18912345678
张XX,号码18112345678“””
可以使用()进行分组:‘r’号码(\d{2,})’,在加上()后就可以指定返回其中的内容。
那又有一个问题:可以有多个括号吗?
比如还是上面的content,需要同时匹配名字和号码:r‘(\w{2,4}).*(\d{1,})’就可以同时匹配名字和电话号码,返回列表。