正则表达式

概述

1.正则表达式功能非常强大,但是学习难度也很大。正则表达式是一套独立的语法,和Python并没有任何相似和相关之处,只不过是Python提供了对正则表达式的支持。

2.正则表达式是编写网络爬虫提取特定内容的重要技术之一。

语法

  • 正则表达式由元字符及其不同组合来构成,通过巧妙地构造正则表达式可以匹配任意字符串,并完成查找、替换、分隔等复杂的字符串处理任务。
  • 元字符是指构成正则表达式的基本单位,是具有独立含义的字符或字符组合。
  • 元字符功能说明
    \r匹配一个回车字符
    \b匹配单词头或者尾
    \B与\b含义相反
    \d匹配任何数字[0-9]
    \D与上表相反
    \s匹配任何空白字符[\f\n\r\v]
    \S与上表相反
    \w匹配任何字母数字下划线[a-z A-Z 0-9]
    \W与上表相反
    ()将位于()内的内容作为一个整体来对待
    {m,n}{}前面的字符或者子模式重复至少m次 之多n次 逗号前后不要有空格
    [^a-z]匹配除小写英文字母之外的任何字符

    扩展语法

  • 正则表达式使用圆括号“()”表示一个子模式,圆括号内的内容作为一个整体对待,例如'(red)+'可以匹配'redred'、'redredred'等一个或多个重复'red'的情况
  • 语法功能说明
    (?P<groupname)为子模式命名
    (?iLmsux)设置匹配标志,可以是几个字母的组合,每个字母含义编译标志相同
    (?……)匹配但不捕获该匹配的子表达式
    (?P=groupname)表示在之前的命名为groupname的子模式
    (?#……)表示注释
    (?<=……)用于正则表达式之前 表示如果<=后的内容在字符串中出现则匹配,但不返回<=之后的内容
    (?=……)用于正则表达式之后,…………
    (?<!……)用于正则表达式之前,…………
    (?!…………)用于正则表达式之后,…………

    (pattern)*:允许模式重复0或者多次

  • (pattern+:允许重复一或者多次

  • (pattern){m,n} 允许重复m-n次

  • 1.正则表达式以^开头并以$结束,表示对整个字符串进行检查和匹配。

  • (a | b)*c:匹配多个(包含0个)a或b,后面紧跟一个字母。
    ab{1,}:等价于'ab+',匹配以字母a开头后面带1个至多个字母b的字符串。
    ^[a-zA-Z]{1}([a-zA-Z0-9._]){4,19}$:匹配长度为5-20的字符串,必须以字母开头并且可带字母、数字、下画线、圆点的字符串。
    ^(\w){6,20}$:匹配长度为6-20的字符串,可以包含字母、数字、下划线。
    ^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$:检查给定字符串是否为合法IP地址。
    ^(13[4-9]\d{8}) | (15[01289]\d{8})$:检查给定字符串是否为移动手机号码。
    ^[a-zA-Z]+$:检查给定字符串是否只包含英文字母大小写。
    ^\w+@(\w+\.)+\w+$:检查给定字符串是否为合法电子邮件地址。
    r'(\w)(?!.*\1):查找字符串中每个字符的最后一次出现。
    (\w)(?=.*\1):查找字符串中所有重复出现的字符。

  • ^(\-)?\d+(\.\d{1,2})?$:检查给定字符串是否为最多带有2位小数的正数或负数。
    [\u4e00-\u9fa5]:匹配给定字符串中所有汉字。
    ^\d{18}|\d{15}$:检查给定字符串是否为合法身份证格式。
    \d{4}-\d{1,2}-\d{1,2}:匹配指定格式的日期,例如2016-1-31。
    ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[,._]).{8,}$:检查给定字符串是否为强密码,必须同时包含英语字母大写字母、英文小写字母、数字或特殊符号(如英文逗号、英文句号、下划线),并且长度必须至少8位。
    (?!.*[\'\"\/;=%?]).+:如果给定字符串中包含'、"、/、;、=、%、?则匹配失败。
    (.)\\1+:匹配任意字符的两次或多次重复出现。
    ((?P<f>\b\w+\b)\s+(?P=f)):匹配连续出现两次的单词。
    ((?P<f>.)(?P=f)(?P<g>.)(?P=g)):匹配AABB形式的成语或字母组合。

  • 直接使用正则表达式模块re处理字符串

  • re.l (支持本地字符集的字符)
  • re.M(多行匹配模式)
  • re.S(使元字符“.”匹配任意字符,包括换行符)
  • re.U(匹配Unicode字符)
  • >>> import re                            #导入re模块
    >>> text = 'alpha. beta....gamma delta'  #测试用的字符串
    >>> re.split('[\. ]+', text)             #使用圆点或空格作为分隔符进行分隔
    ['alpha', 'beta', 'gamma','delta']
    >>> re.split('[\. ]+', text, maxsplit=2) #设置最多分隔2次
    ['alpha', 'beta', 'gamma delta']
    >>> re.split('[\. ]+', text, maxsplit=1) #最多分隔1次
    ['alpha', 'beta....gamma delta']
    >>> pat = '[a-zA-Z]+'
    >>> re.findall(pat, text)                #查找所有单词
    ['alpha', 'beta', 'gamma','delta']
    >>> re.findall('\\b\w.+?\\b', example)      #所有单词
    ['Beautiful', 'is', 'better', 'than', 'ugly']
    
    >>> re.findall('\w+', example)          #所有单词
    ['Beautiful', 'is', 'better', 'than', 'ugly']
    
    >>> re.findall(r'\b\w.+?\b', example)      #使用原始字符串
    ['Beautiful', 'is', 'better', 'than', 'ugly']
    
    >>> re.split('\s', example)           #使用任何空白字符分隔字符串
    ['Beautiful', 'is', 'better', 'than', 'ugly.']
    
    >>> re.findall('\d+.\d+.\d+', 'Python 2.7.13') #查找并返回x.x.x形式的数字
    ['2.7.13']
    
    >>> re.findall('\d+.\d+.\d+', 'Python 2.7.13,Python 3.6.0')
    ['2.7.13', '3.6.0']
    
    >>> s = '<html><head>This is head.</head><body>This is body.</body></html>'
    >>> pattern = r'<html><head>(.+)</head><body>(.+)</body></html>'
    >>> result = re.search(pattern, s)
    >>> result.group(1)               #第一个子模式
    'This is head.'
    
    >>> result.group(2)               #第二个子模式
    'This is body.'

    match对象

  • group()返回匹配的一个或多个子模块内容
  • start()返回匹配的一个或多个子模块内容
  • end()返回指定子模块内容的结束位置的前一个位置
  • >>> import re
    >>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
    >>> m.group(0)          #返回整个模式内容
    'Isaac Newton'
    
    >>> m.group(1)          #返回第1个子模式内容
    'Isaac'
    
    >>> m.group(2)          #返回第2个子模式内容.
    'Newton'
    
    >>> m.group(1, 2)        #返回指定的多个子模式内容
    ('Isaac', 'Newton')
    >>> import re
    >>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
    
    >>> m.group('first_name')   #使用命名的子模式
    'Malcolm'
    
    >>> m.group('last_name')
    'Reynolds'
    
    >>> m = re.match(r"(\d+).(\d+)", "24.1632")
    >>> m.groups()         #返回所有匹配的子模式(不包括第0个)
    ('24', '1632')
    
    >>> m = re.match(r"(?P<first_name>\w+) (?P<last_name>\w+)", "Malcolm Reynolds")
    >>> m.groupdict()       #以字典形式返回匹配的结果
    {'first_name': 'Malcolm', 'last_name': 'Reynolds'}
    >>> s = 'aabc abcd abbcd abccd abcdd'
    >>> re.findall(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b)', s) #连续重复出现的字母组合
    [('aabc', 'a'), ('abbcd', 'b'), ('abccd', 'c'), ('abcdd', 'd')]
    >>> s = 'aabc abcd ababcd abccd abcdd'
    >>> re.findall(r'(\b\w*(?P<f>\w+)(?P=f)\w*\b)', s) #连续重复出现的字母组合
    [('aabc', 'a'), ('ababcd', 'ab'), ('abccd', 'c'), ('abcdd', 'd')]
    import re
    
    text = '''Suppose my Phone No. is 0535-1234567,
    yours is 010-12345678,
    his is 025-87654321.'''
    
    #注意,下面的正则表达式中大括号内逗号后面不能有空格
    matchResult = re.findall(r'(\d{3,4})-(\d{7,8})', text)
    for item in matchResult:
       print(item[0], item[1], sep='-')

查找文本中最长的数字字符串 

import re

def longest1(s):
  '''查找所有连续数字'''
  t = re.findall('\d+', s)
  if t:
    return max(t, key=len)
  return 'No'
text = 'a1b22ccc333d22e1'
print(longest1(text))

将一句英语文本中的单词进行倒置

import re

def reverse(s):
  t = re.split('\s+', s.strip())
  t.reverse()
  return ' '.join(t)

print(reverse('I like beijing.'))
print(reverse('Simple is better than complex.'))

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

撸码的xiao摩羯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值