最近在爬虫,学习一下正则表达式。
import re
特殊字符
- ‘$’ 匹配输入字符串的结尾位置
re.search(r"123", "123abc")#<_sre.SRE_Match object; span=(0, 3), match='123'>
re.search(r"123$", "123abc")#None
- '^'匹配输入字符串的开始位置。
re.search(r"123", "abc123")#<_sre.SRE_Match object; span=(3, 6), match='123'>
re.search(r"^123", "abc123")#None
- '()'标记一个子表达式的开始和结束位置。
re.search(r"(ab)", "abc")#<_sre.SRE_Match object; span=(0, 2), match='ab'>
- '*'匹配前面的子表达式零次或多次。
re.search(r"a*", "")#<_sre.SRE_Match object; span=(0, 0), match=''>
re.search(r"a*", "aa")#<_sre.SRE_Match object; span=(0, 2), match='aa'>
- '+'匹配前面的子表达式一次或多次。
re.search(r"a+", "")#None
re.search(r"a+", "a")#<_sre.SRE_Match object; span=(0, 1), match='a'>
re.search(r"a+", "aa")#<_sre.SRE_Match object; span=(0, 2), match='aa'>
- '.'匹配除换行符\n之外的任何单字符。
re.search(r".", "1")#<_sre.SRE_Match object; span=(0, 1), match='1'>
re.search(r".", "a")#<_sre.SRE_Match object; span=(0, 1), match='a'>
re.search(r".", "啊")#<_sre.SRE_Match object; span=(0, 1), match='a'>
re.search(r".*", "啊abc123")#<_sre.SRE_Match object; span=(0, 7), match='啊abc123'>
- '['标记一个中括号表达式的开始。
re.search(r"[a]", "abc")#<_sre.SRE_Match object; span=(0, 1), match='a'>
- '?'匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
re.search(r"(ab)?", "abc")#<_sre.SRE_Match object; span=(0, 2), match='ab'>
- ’\'将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
re.search(r"\?", "?")#<_sre.SRE_Match object; span=(0, 1), match='?'>
- ‘{’标记限定符表达式的开始。
re.search(r"\d{3}", "123")#<_sre.SRE_Match object; span=(0, 3), match='123'>
- ’|‘指明两项之间的一个选择。
re.search(r"[a|b|c]", "abc")#<_sre.SRE_Match object; span=(0, 1), match='a'>
限定符
- ‘*’匹配前面的子表达式零次或多次。
- ‘+’匹配前面的子表达式一次或多次。
- ‘?'匹配前面的子表达式零次或一次。
- ‘{n}'匹配确定的n次。
- ’{n,}'匹配至少n次。
- ‘{n,m}’匹配n-m次。
贪婪匹配和最小匹配
re.search('<.*>', '<H1>Chapter 1 - 介绍正则表达式</H1>')#<_sre.SRE_Match object; span=(0, 28), match='<H1>Chapter 1 - 介绍正则表达式</H1>'>
re.search('<.*?>', '<H1>Chapter 1 - 介绍正则表达式</H1>')#<_sre.SRE_Match object; span=(0, 4), match='<H1>'>
‘.*’具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯,尽可能多地匹配所搜索的字符串。
而‘.*?’则相反,一个匹配以后,就往下进行,不会进行回溯,具有最小匹配的性质,尽可能少地匹配所搜索的字符串。
通过在*、+或?限定符之后放置?,该表达式从贪婪匹配转换为最小匹配。
定位符
- ’^'匹配输入字符串开始的位置。
- ‘$'匹配输入字符串结尾的位置。
- ’\b‘匹配一个单词边界,即字和空格间的位置。
re.search('\\bnic', "It's a nice day today.")#<_sre.SRE_Match object; span=(7, 10), match='nic'>
re.search('ice\\b', "It's a nice day today.")#<_sre.SRE_Match object; span=(7, 10), match='ice'>
- ’\B’匹配非单词边界。
re.search('\\Bic', "It's a nice day today.")#<_sre.SRE_Match object; span=(8, 10), match='ic'>
非捕获组
非捕获组只匹配结果,但不捕获结果,也不会分配组号,不能在表达式中做进一步处理。
- (?:pattern)匹配pattern,但不捕获匹配结果。
re.search('industr(?:y|ies)', 'industry')#<_sre.SRE_Match object; span=(0, 8), match='industry'>
re.search('industr(?:y|ies)', 'industries')#<_sre.SRE_Match object; span=(0, 10), match='industries'>
- (?=pattern)零宽度正向预查,不捕获匹配结果,正向先行断言。
re.search('Windows(?=7|8|10)', 'Windows10')#<_sre.SRE_Match object; span=(0, 7), match='Windows'>
re.search('Windows(?=7|8|10)', 'Windows3.1')#None
- (?!pattern)零宽度负向预查,不捕获匹配结果,反向先行断言。
re.search('Windows(?!7|8|10)', 'Windows3.1')#<_sre.SRE_Match object; span=(0, 7), match='Windows'>
- (?<=pattern)零宽度正向回查,不捕获匹配结果,正向先行断言。
re.search('(?<=Office)2019', "Office2019")#<_sre.SRE_Match object; span=(6, 10), match='2019'>
re.search('(?<=Office|excel)2019', "Office2019")#error: look-behind requires fixed-width pattern,python的re不支持变长先行断言
re.search('(?<=Office|excel1)2019', "Office2019")#<_sre.SRE_Match object; span=(6, 10), match='2019'>
- (?<!pattern)零宽度反向回查,不捕获匹配结果,反向先行断言。
re.search('(?<!Office|excel1)2019', "Office2019")#None