python-正则表达式regex-知识点

  • import re 导入re模块

    \d是一个正则表达式,表示一位数字字符

    \d{3}表示匹配该模式3次==\d\d\d

    re.compile()传入一个字符串值,表示正则表达式,它将返回一个 Regex 模式对象

    search()方法查找传入的字符串,寻找该正则表达式的所有匹配。若没匹配到,返回None;匹配到了,返回Match对象

  • Match 对象有一个 group()方法,它返回被查找字符串中实际匹配的文本

    import re
    
    phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
    # r'\d\d\d-\d\d\d-\d\d\d\d' is 原始字符串
    mo = phoneNumRegex.search('My number is 415-555-4242.')
    print('Phone number found: ' + mo.group())
    # Phone number found: 415-555-4242
    
  • 利用括号分组,可以使用 group()匹配对象方法,从一个分组中获取匹配的文本

    group()可以传递参数:默认是0或不传参数,返回匹配的整个文本

    groups()可以获得所有分组,返回多个值的元组

    phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
    mo = phoneNumRegex.search('My number is 415-555-4242.')
    print(mo.group(1))
    # 415
    print(mo.groups())
    # ('415', '555-4242')
    
  • 正则表达式匹配括号(),使用[ ]

    imgfile = re.compile(r'.*?([(])(\d*)([)])')
    mo = imgfile.search('img(32)')
    mo.groups()
    # ('(', '32', ')')
    
  • 用管道|匹配多个分组 匹配多个表达式中的一个 ≈or

    若字符串里有多个匹配成功,第一个出现的文本,会作为Match对象返回

    若匹配的多个字符前缀相同,可以使用括号
    eg:‘Batman’、‘Batmobile’、‘Batcopter’和’Batbat’可以写成 re.compile(r’Bat(man|mobile|copter|bat)’)

  • 问号 匹配零次或一次 (\d)? 表示匹配单个数字零次或一次

  • 星号* 匹配零次或多次

  • 加号+ 匹配一次或多次

  • 花括号{} 匹配指定次数
    (hi){2}表示匹配字符串’hihi’
    (hi){2,5}表示匹配的字符串里的hi可以是2~5个hi
    r’(hi){3,5}’ 默认匹配最长的’hihihihihi’ (贪心匹配)
    r’(hi){3,5}?'加一个问号匹配最短的’hihihi (非贪心匹配)

  • findall()方法,可以匹配所有符合的文本 返回一个字符串列表或返回一个字符串的元组的列表

    >>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')	# 没有分组
    >>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
    ['415-555-9999', '212-555-0000']
    
    >>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)') # 有分组
    >>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
    [('415', '555', '1122'), ('212', '555', '0000')]
    
  • 缩写字符分类表示
    \d0 到 9 的任何数字
    \D除 0 到 9 的数字以外的任何字符
    \w任何字母、数字或下划线字符(可以认为是匹配“单词”字符)
    \W除字母、数字和下划线以外的任何字符
    \s空格、制表符或换行符(可以认为是匹配“空白”字符)
    \S除空格、制表符和换行符以外的任何字符
    .通配字符.匹配除了换行之外的所有字符
    .*匹配所有字符

    .*? 非贪心模式
    .* 贪心模式

  • re.compile(‘.*’, re.DOTALL)
    通过传入 re.DOTALL 作为 re.compile()的第二个参数,可以让句点字符匹配所有字符,包括换行字符。

  • re.IGNORECASEre.I
    忽略匹配的大小写

  • 建立自己的字符分类
    用方括号定义自己的字符分类
    用短横表示字母或数字的范围
    在字符分类的左方括号后加上一个插入字符(^),就可以得到“非字符类”
    re.compile(r’[^a-zA-Z0-9]') # 将匹配所有小写字母、大写字母、数字和非字符类(.?*等)

  • 插入字符^和美元字符$

    必须使用正则表达式
    ^以xxx开头 $以xxx结尾

    >>> wholeStringIsNum = re.compile(r'^\d+$') 
    >>> wholeStringIsNum.search('1234567890')
    <_sre.SRE_Match object; span=(0, 10), match='1234567890'>
    >>> wholeStringIsNum.search('12 34567890') == None
    True
    
  • sub()方法替换字符串

    >>> namesRegex = re.compile(r'Agent \w+')		# \w+ 任意子母、数字或下划线匹配多次
    >>> namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.')
    'CENSORED gave the secret documents to CENSORED.'
    
    >>> agentNamesRegex = re.compile(r'Agent (\w)\w*') 		# (\w)分组
    >>> agentNamesRegex.sub(r'\1****', 'Agent Alice told Agent Carol that Agent 
    Eve knew Agent Bob was a double agent.')
    A**** told C**** that E**** knew B**** was a double agent.'
    
  • 较复杂的正则表达式
    re.VERBOSE
    忽略正则表达式字符串中的空白符和注释

    phoneRegex = re.compile(r'((\d{3}|\(\d{3}\))?(\s|-|\.)?\d{3}(\s|-|\.)\d{4}
    (\s*(ext|x|ext.)\s*\d{2,5})?)')
    

    可以写成下面的代码,清晰易懂

    phoneRegex = re.compile(r'''(
     (\d{3}|\(\d{3}\))? 			# area code
     (\s|-|\.)? 					# separator
     \d{3} 							# first 3 digits
     (\s|-|\.) 						# separator
     \d{4} 							# last 4 digits
     (\s*(ext|x|ext.)\s*\d{2,5})? 	# extension
     )''', re.VERBOSE)
    
  • 第二个参数只能传一个,若想传入多个可以使用|按位符

    re.compile(‘foo’, re.IGNORECASE | re.DOTALL | re.VERBOSE)


Regex Tester - Javascript, PCRE, PHP
Test your Javascript and PCRE regular expressions online
在线测试Javascript和PCRE正则表达式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蔷莫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值