正则表达式学习

最近在爬虫,学习一下正则表达式。

import re

特殊字符

  1. ‘$’ 匹配输入字符串的结尾位置
re.search(r"123", "123abc")#<_sre.SRE_Match object; span=(0, 3), match='123'>
re.search(r"123$", "123abc")#None
  1. '^'匹配输入字符串的开始位置。
re.search(r"123", "abc123")#<_sre.SRE_Match object; span=(3, 6), match='123'>
re.search(r"^123", "abc123")#None
  1. '()'标记一个子表达式的开始和结束位置。
re.search(r"(ab)", "abc")#<_sre.SRE_Match object; span=(0, 2), match='ab'>
  1. '*'匹配前面的子表达式零次或多次。
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'>
  1. '+'匹配前面的子表达式一次或多次。
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'>
  1. '.'匹配除换行符\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'>
  1. '['标记一个中括号表达式的开始。
re.search(r"[a]", "abc")#<_sre.SRE_Match object; span=(0, 1), match='a'>
  1. '?'匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
re.search(r"(ab)?", "abc")#<_sre.SRE_Match object; span=(0, 2), match='ab'>
  1. ’\'将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
re.search(r"\?", "?")#<_sre.SRE_Match object; span=(0, 1), match='?'>
  1. ‘{’标记限定符表达式的开始。
re.search(r"\d{3}", "123")#<_sre.SRE_Match object; span=(0, 3), match='123'>
  1. ’|‘指明两项之间的一个选择。
re.search(r"[a|b|c]", "abc")#<_sre.SRE_Match object; span=(0, 1), match='a'>

限定符

  1. ‘*’匹配前面的子表达式零次或多次。
  2. ‘+’匹配前面的子表达式一次或多次。
  3. ‘?'匹配前面的子表达式零次或一次。
  4. ‘{n}'匹配确定的n次。
  5. ’{n,}'匹配至少n次。
  6. ‘{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>'>

‘.*’具有贪婪的性质,首先匹配到不能匹配为止,根据后面的正则表达式,会进行回溯,尽可能多地匹配所搜索的字符串。
而‘.*?’则相反,一个匹配以后,就往下进行,不会进行回溯,具有最小匹配的性质,尽可能少地匹配所搜索的字符串。
通过在*、+或?限定符之后放置?,该表达式从贪婪匹配转换为最小匹配。

定位符

  1. ’^'匹配输入字符串开始的位置。
  2. ‘$'匹配输入字符串结尾的位置。
  3. ’\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'>
  1. ’\B’匹配非单词边界。
re.search('\\Bic', "It's a nice day today.")#<_sre.SRE_Match object; span=(8, 10), match='ic'>

非捕获组

非捕获组只匹配结果,但不捕获结果,也不会分配组号,不能在表达式中做进一步处理。

  1. (?: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'>
  1. (?=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
  1. (?!pattern)零宽度负向预查,不捕获匹配结果,反向先行断言。
re.search('Windows(?!7|8|10)', 'Windows3.1')#<_sre.SRE_Match object; span=(0, 7), match='Windows'>
  1. (?<=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'>
  1. (?<!pattern)零宽度反向回查,不捕获匹配结果,反向先行断言。
re.search('(?<!Office|excel1)2019', "Office2019")#None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值