Python 正则表达式,实战篇!

整理自: Automate the Boring Stuff with Python
作者: Al Sweigart

正则表达主讲目录

    • 1. 创建正则表达式对象和匹配Regex对象
    • 2. 正则表达式匹配更多模式
      • 2.1 利用括号分组
      • 2.2 在文本中匹配括号
    • 3. 用管道匹配多个分组
      • 3.1 匹配多个模式中的一个
    • 4. 用问号实现可选匹配:
      • 4.1.1 让正则表达式寻找包含区号或不包含区号的电话号码
    • 5. 用星号匹配零次或多次
    • 6. 用加号匹配一次或多次
    • 7. 用加号匹配一次或多次
    • 8. 贪心和非贪心匹配
    • 9. findall()方法
      • 9.1 search() 和 findall() 返回值的对比
      • 9.2 findall()分组情况,返回列表
    • 10. 字符分类总结
    • 11. 建立自己的字符分类
      • 11.1 非 ^ 的情况
      • 11.2 有 ^ 的情况
    • 12. 插入字符和美元字符
      • 12.1 使用^ 的情况
      • 12.2 使用$ 的情况
      • 12.3 使用 “+$ ”的情况
    • 13. 通配字符
      • 13.1 用点-星匹配所有字符
      • 13.2 用句点字符匹配换行
    • 14. 正则表达式符号复习
    • 15. 不区分大小写
    • 16. 用sub方法替换字符串
    • 17. 管理复杂的正则表达式
    • 18. 组合使用 re.IGNOREC ASE、re.DOTALL 和 re.VERBOSE
    • 最后: 实战篇
        • 项目描述:
            • 项目的路线图

1. 创建正则表达式对象和匹配Regex对象

re.compile() 传入一个字符串值,表示正则表达式,它将返回一个 Regex 模式 对象(或者就简称为 Regex 对象)。Regex 对象的 search() 方法查找传入的字符串,寻找该正则表达式的所有匹配。如果字符串中没有找到该正则表达式模式,search() 方法将返回 None。如果找到了该模式, search() 方法将返回一个 Match 对象。Match 对象有一个 group() 方法,它返回被查找字符串中实际匹配的文本。

import re
# 因为正则表达式常常使用倒斜杠,向 re.compile()函数传入原始字符串就很方便
# r: 忽略所有的转义字符,打印出字符串中所有的倒斜杠
phoneNumber = re.compile(r'\d{3}-\d{3}-\d{3}') # Regex 对象
mo = phoneNumber.search('Mu Number is 400-000-999') # 返回一个 Match 对象
mo.group()
>> '400-000-999'

2. 正则表达式匹配更多模式

2.1 利用括号分组

添加括号将在正则表达式中创建“分组”: (\d\d\d)-(\d\d\d-\d\d\d\d)。然后可以使用 group()匹配对象方法,从一个分组中获取匹配的文本。

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))
print(mo.group(2))
#一次就获取所有的分组 
print(mo.groups())

>> 415-555-4242
>> 555-4242
>> ('415', '555-4242')

2.2 在文本中匹配括号

括号在正则表达式中有特殊的含义,但是如果你需要在文本中匹配括号,怎么办?例如,你要匹配的电话号码,可能将区号放在一对括号中。传递给 re.compile()的原始字符串中,(和)转义字符将匹配实际的括号字符。

 #phoneNumRegex = re.compile(r'(\(\d\d\d\)) (\d\d\d-\d\d\d\d)')
phoneNumRegex = re.compile(r'(\(\d{3}\)) (\d{3}-\d{4})')
mo = phoneNumRegex.search('My phone number is (415) 555-4242.')
print(mo.group(1))
>> (415)

3. 用管道匹配多个分组

字符 | 称为 管道。希望匹配许多表达式中的一个时,就可以使用它。例如, 正则表达式 r**Batman | Tina Fey **将匹配 BatmanTina Fey。 如果 BatmanTina Fey 都出现在被查找的字符串中,第一次出现的匹配文本, 将作为 **Match **对象返回。

heroRegex = re.compile(r'Brain|head') # 中间不要有空格,不然第二个打印报错
mo1 = heroRegex.search('Brain and head')
print(mo1.group())
mo2 = heroRegex.search('head and Brain')
mo2.group()
print(mo2.group())

>> Brain
>> head

3.1 匹配多个模式中的一个

batRegex = re.compile(r'Bat(man|mobile|copter|bat)')
mo = batRegex.search('Batmobile lost a wheel')
print(mo.group())
print(mo.group(1)) # 只是返 回第一个括号分组内匹配的文本'mobile'
print(mo.groups())

>> Batmobile
>> mobile
>> ('mobile',)

4. 用问号实现可选匹配:

匹配的模式是可选的。就是说,不论这段文本在不在,正则表达式 都会认为匹配。字符 ? 表明它前面的分组在这个模式中是可选的,如果需要匹配真正的问号字符,就使用转义字符 \?

batRegex = re.compile(r'Bat(wo)?man')
mo1 = batRegex.search('The Adventures of Batman')
print(mo1.group())
mo2 = batRegex.search('The Adventures of Batwoman')
print(mo2.group())
print(mo2.group(1)) # 这个才有分组,因为匹配的对象有:“wo”;  (wo)?部分表明,模式 wo 是可选的分组

>> Batman
>> Batwoman
>> wo

4.1.1 让正则表达式寻找包含区号或不包含区号的电话号码

phoneRegex = re.compile(r'(\d{3}-)?\d{3}-\d{4}')
mo1 = phoneRegex.search('My Number is 411-234-4566')
# 建议都打出来看看
print(mo1.group())
print(mo1.group(1))
print(mo1.groups

你可能感兴趣的:(后端开发,git,Python,正则,Python正则,实战篇)