Django从入门到精通

Python正则表达式re模块,一文看懂【收藏】

2019-06-13  本文已影响0人  轻编程

1.1 用正则表达式查找文本

案例:

1.1.1 创建正则表达式对象

Python中所有表达式的函数都在 re 模块中。需导入模块!

案例:

phoneNumberRegex = re.compile(r'\d{3}-\d{3}-\d{4}')
mo = phoneNumberRegex.search('My number is 415-555-4242.')
print(str(mo.group()))

1.1.2 用括号为正则表达式分组

假定你想将029-33660111这样的座机电话号码区号单独提取出来,那么可以用括号为正则表达式分组:r'(\d{3})-(\d{7})'然后使用 group()匹配对象方法,从一个分组中获取匹配的文本,第一个括号为第一组,逐次增加,不传入参数或传入为0,则返回整个匹配。

案例:

如果想一次返回所有分组,则可以使用,groups() 方法, 返回的是一个元组。

import pyperclip, re

def RegexPhoneNumber(regex, num=0):
    """ 将400电话提取拷贝到剪贴板的程序 """
    # 接收剪贴板的文本
    text = pyperclip.paste()
    # 创建正则表达式对象
    textRegex = re.compile(regex)
    # 匹配该表达式中的文本
    mo = textRegex.search(text)
    if mo is not None: 
        if num == 0:
            text = pyperclip.copy(mo.group())
            print('这段文字里有匹配的电话:' + mo.group())
            num1, num2 = mo.groups()  # 元组的多重赋值
            print('这段文字里有匹配的电话:' + num1)
            print('这段文字里有匹配的电话:' + num2)
        else:
            # 您的正则表达式分组了,并且只提取指定组的内容
            text = pyperclip.copy(mo.group(num))
            print('这段文字里有匹配的电话:' + mo.group(num))
    else:
        print('这段文字里没有匹配的电话!')

RegexPhoneNumber(r'(\d{3})-(\d{4}-\d{3})')  # 匹配 400-9946-555 这种格式的正则

# RegexPhoneNumber(r'(\d{3})-(\d{4}-\d{3})', num=2)

1.1.3 利用管道匹配多个分组

字符|称为“管道”。匹配多个表达式中的一个,语法格式为:r'zhang|zhen',是或的关系,匹配这个或者那个。

案例:

>>> import re
>>> heroRegex = re.compile(r'zhang|zhen')
>>> mo1 = heroRegex.search('my name is zhang xing fu or zhang zhen?')
>>> mo1.group()
'zhang'

案例:

>>> batRegex = re.compile(r'Bat(man|mobile|copter|bat)')
>>> mo = batRegex.search('Batmobile lost a wheel')
>>> mo.group(1)
>>> mobile
>>> mo.group()
>>> Batmobile

1.1.4 利用问号实现可选匹配

有时我们会有这样的需求,例如想匹配的某个选项不是必须的,如果存在就匹配,不存在则略过,匹配其他的正则,此时可以使用 ()? 这样的方式。

案例1:

>>> import re
>>> batRegex = re.compile(r'Bat(wo)?man')
>>> mo1 = batRegex.search('the adventures of Batman')
>>> mo1.group()
'Batman'
>>> mo2 = batRegex.search('the adventures of Batwoman')
>>> mo2.group()
'Batwoman'

案例2:匹配一个电话号,有区号的则匹配没有区号则直接匹配电话,例如:029-33660111这样的格式。

>>> import re
>>> phoneNumber = re.compile(r'(\d{3}-)?\d{7}')
>>> mo1 = phoneNumber.search('我们公司的点化石:029-33660111')
>>> mo1.group()
'029-3366011'
>>> mo2 = phoneNumber.search('我们公司的点化石:33660111')
>>> mo2.group()
'3366011'

1.1.5 用星号匹配零次或多次

* 这个符号称为星号,匹配零次或多次,也就意味着星号前边的分组可以不存在,也可以出现多次,均可匹配。与之类似的是用 加号匹配一次或多次,意味着加号之前的分组至少得出现一次。

1.2 findall()方法, 返回所有匹配:

1.3 字符分类

1.4 建立自己的字符分类

有时候你想匹配一组字符,但缩写的字符分类(\d、\w、\s 等)太宽泛。你可
以用方括号[]定义自己的字符分类。

1.5 插入字符和美元字符

可以在正则表达式的开始处使用插入符号(^),表明匹配必须发生在被查找文本开始处。类似地,可以再正则表达式的末尾加上美元符号(),表示该字符串必 须以这个正则表达式的模式结束。可以同时使用^和,表明整个字符串必须匹配该模式,也就是说,只匹配该字符串的某个子集是不够的。

1.6 通配字符

在正则表达式中,.(句点)字符称为“通配符”。它匹配除了换行之外的所有字符。

备注:如果想使用点-星匹配所有的字符包括换行,通过传入 re.DOTALL 作为 re.compile()的第二个参数,可以让句点字符匹配所有字符,包括换行字符。

1.7 正则表达式符号复习

上一篇 下一篇

猜你喜欢

热点阅读