1.贪婪匹配和非贪婪匹配
- 贪婪匹配:顾名思义,贪婪,匹配满足条件越多越好
- 非贪婪匹配,相反,匹配满足条件越少越好
python默认是贪婪匹配,要想不贪在量词后面加个?警告就好了。
举个栗子
s1 = 'abcd我123'
re.findall('[a-z]+',s1)
输出:['abcd']
re.findall('[a-z]+?',s1)
输出:['a', 'b', 'c', 'd']
2.()带来的误区
- 没有括号
没有括号很简单,你写的啥匹配啥 - 一个括号
整个正则表达式都去匹配,但是只输出括号里的东西 - 两个括号
输出一个list,list里的内容是tuple,包含了所有匹配结果和第一个括号里的匹配结果。
举个栗子(虽然很不想,因为太简单)
string="2345 3456 4567 5678"
regex2 = re.compile("\w+\s+\w+")
输出:['2345 3456', '4567 5678']
regex2 = re.compile("(\w+)\s+\w+")
输出:['2345', '4567']
regex2=re.compile("((\w+)\s+\w+)")
regex2.findall(string)
输出:[('2345 3456', '2345'), ('4567 5678', '4567')]
3.分组
正则的分组是一个比较神奇的概念,一般是在re.match()中用到,分组代表匹配到的第几个结果。使用group[0-n]能获得匹配的第0-n个结果。我通常嫌这个麻烦,一般都用findall。
举个栗子
s='<div><a href="https://support.google.com/chrome/?p=ui_hotword_search" target="_blank">更多</a><p>dfsl</p></div>'
re.match(r'.*<a.*>(.*)</a>',s)
输出:<re.Match object; span=(0, 92), match='<div><a href="https://support.google.com/chrome/?>'
是得不到你要的东西的
re.match(r'.*<a.*>(.*)</a>',s).group()
输出:<re.Match object; span=(0, 92), match='<div><a href="https://support.google.com/chrome/?>'
整个正则表达式被当为第一组的内容啦,group里有没有0都是整个正则表达式的匹配。
re.match(r'.*<a.*>(.*)</a>',s).group()
输出:'更多'
4.断言
- (?:)
用的最多,括号里的东西匹配上了但不输出,用的时候好好看看你的正则表达式和括号分组结合起来用,才能达到想要的正则效果。 - (?<=pattern)
以某个东西开头的匹配,括号里的东西不输出 - (?!=pattern)
不是以某个东西开头的东西,括号里的东西不输出 - (?=pattern)
以某个东西结尾的匹配,括号里的东西不输出
-(?!=pattern)
不以某个东西结尾的匹配,括号里的东西不输出
这个东西也不是不好理解,那个例子先欠着,后续补上。
5.正则 命名
后续补充吧,目前还没用上。
网友评论