首頁  >  文章  >  後端開發  >  詳細講解 Python中的正規表示式

詳細講解 Python中的正規表示式

coldplay.xixi
coldplay.xixi轉載
2020-11-03 16:54:303590瀏覽

python教程栏目讲解正则表达式知识。

詳細講解 Python中的正規表示式

正则表达式应用的场景也非常多。常见的比如:搜索引擎的搜索、爬虫结果的匹配、文本数据的提取等等都会用到,所以掌握甚至精通正则表达式是一个硬性技能,非常必要。

正则表达式

正则表达式是一个特殊的字符序列,由普通字符和元字符组成。元字符能帮助你方便的检查一个字符串是否与某种模式匹配。

Python中则提供了强大的正则表达式处理模块,即 re 模块, 为Python的内置模块。

下面,我带大家来一个入门demo例子,代码如下:

import rereg_string = "hello9527python@wangcai.@!:xiaoqiang"
reg = "hello"result = re.findall(reg,reg_string)
print(result)复制代码

这里reg_string就是我们的普通字符,reg就是我们的元字符。

我们使用 re 模块中的findall函数,进行匹配,返回的结果是列表数据类型。

我们使用正则表达式,就是为了在很长的字符串中,找到我们需要的字符串片段。

元字符

Python中常见元字符及其含义如下:

元字符 含义
. 匹配除换行符以外的任意字符
\\\\w 匹配数字字母下划线汉字
\\\\s 匹配任意空白符
\\\\d 匹配所有的数字
\\\\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的开始结束
下面,我们具体使用下Python中的常见的元字符。

我们还是使用上次的例子,这次我们需要在reg_string匹配出我们的数字,只需要将reg换成\\\\d,代码如下图所示。

比如,我们在之前的reg的hello前面加上一个^,意味着我们 匹配字符串的开始的hello,那么结果就是一个,就是我们开头的hello。

如果,我们把reg换成\\\\w,代码如下图所示。

这样就是匹配数字字母下划线,包括我们的汉字。

反义代码

Python中常见反义代码 及其含义如下:

反义代码 含义
\\\\W 匹配任意不是数字字母下划线汉字的字符
\\\\S 匹配任意不是空白符的字符
\\\\D 匹配非数字
\\\\B 匹配不是单词的开始或结束
[^a] 匹配除了a以外的任意字符
[^abcd] 匹配除了abcd以外的任意字符

其实,记忆很简单,我们是不是知道\\\\d匹配数字,那么\\\\d的大写\\\\D就是匹配非数字,元字符[a]匹配a任意字符,那么[^a]就是匹配除了a以外的任意字符。

下面是具体例子

>>> import re>>> reg_string = "hello9527python@wangcai.@!:xiaoqiang"
>>> reg = "\\\\D">>> re.findall(reg,reg_string)
['h', 'e', 'l', 'l', 'o', 'p', 'y', 't', 'h', 'o', 'n', '@', 'w', 'a', 'n', 'g', 'c', 'a', 'i', '.', '@', '!', ':', 'x', 'i', 'a', 'o', 'q', 'i', 'a', 'n', 'g']
>>> reg = "[^a-p]"['9', '5', '2', '7', 'y', 't', '@', 'w', '.', '@', '!', ':', 'x', 'q']复制代码

限定符

什么是限定符?就是限定我们匹配的个数的东西。

Python中常见限定符 及其含义如下:

限定符 含义
* 重复零次或多次
+ 重复一次或多次
重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n次到m次 {1,3}

我們還是用我們之前的reg_string,這次我們限定了元字元為\\\\d{4},也就是我們的匹配的數字必須是4個。

下面,我們來提高難度,配對字母和數字,限定個數為4個。

這樣我們可以使用[0-9a-z]{4},作為我們的元字符,[0-9a-z]代表了0到9的十個數字和a到z的小寫26個英文字母。 [0-9a-z]{4}限定了個數為4個。

我們列印輸出下。

如果遇到了不是在[0-9a-z]範圍內,就會跳過,直到後面的4個都是在[0-9a-z]範圍內就列印輸出。

符合ip位址

在網際網路中,一台主機只有一個IP位址。 IP位址用於在TCP/IP通訊協定中標記每台電腦的位址,通常用於十進位來表示,如192.168.1.100。

在window系統中,我們可以透過ipconfig查看我們的ip。在linux系統中,我們可以透過ifconfig查看我們的ip。

我們的ip字串是這樣子的:ip = "this is ip:192.168.1.123 :172.138.2.15"

下面要求使用正規表示式,將ip匹配出來。

其實,我們主要寫元字元。例如:reg = "\\\\d{3}.\\\\d .\\\\d .\\\\d ",因為第一個數字必須是三位數開頭,我們可以設定\\\\d{3}固定起來。

我們除了可以使用findall,也可以使用search,我們把元字元reg = "(\\\\d{1,3}.){3}\\\\ d{1,3}"

這元字元中的\\\\d{1,3}.指定是我們ip前三個數字,後面加上{3}就是重複3次。 \\\\d{1,3}指的就是我們ip最後一個數字。

但是search和findall是有差別的,search只能符合第一個,我們需要使用清單取出第一個,而findall則是符合所有。

群組匹配

什麼是群組匹配,比如說這裡邊我有一個字串s = this is phone:138888888888 and this is my postcode:012345,我需要你把手機號碼和驗證碼配對出來。

因為,我們要配對兩個,而已每個的元字元都是不一樣的。所以,我們需要分組來匹配。

正規表示式的括號表示分組匹配,括號中的模式可以用來匹配分組的內容。

於是我們的元字元就變成:reg = this is phone:(\\\\d{11}) and this is my postcode:(\\\\d{6})

我們一般使用search進行分組匹配,上次我是不是說過search需要使用列表取出來,這裡的組匹配也是一樣,不過這裡用的是group()方法。 group(1)代表了我們的手機號,group(2)代表了我們的驗證碼,而group(0)代表了我們的手機號碼和驗證碼,代碼如下圖所示。

在正規表示式中,除了findall和search用法,還有一個match用法。

match用法只符合開頭的,也是需要group()取出來,下圖match的範例。

這是的re.I是忽略大小寫的意思。

貪婪與非貪婪

貪婪與非貪婪模式影響的是被量詞修飾的子表達式的匹配行為,貪婪模式在整個表達式匹配成功的前提下,盡可能多的匹配,而非貪婪模式在整個表達式匹配成功的前提下,盡可能少的匹配。

貪婪和非貪婪有幾個非常重要的操作符。

運算子 意思
* #重複零次或更多次
重複一次或更多
重複零次或一次
#

比如说这里边我有一个字符串reg_string = pythonnnnnnnnnpythonHelloPytho,我们先使用贪婪的模式下的元字符:reg = "python*"

贪婪模式下的reg = "python*",意味着n重复零次或更多次。所以我们看到了第一关结果的pythonnnnnnnnn尽可能多的匹配。

下面使用非贪婪的模式下的元字符:reg = "python*?",reg = "python+?",reg = "python??"

非贪婪模式下的reg = "python*",意味着n零次或一次,所以我们没有看到pythonnnnnnnnn的结果。

手机号码验证

首先,我们要知道我们的手机号码是什么开头的?

移动手机号码开头有16个号段:134、135、136、137、138、139、147、150、151、152、157、158、159、182、187、188。

联通手机号码开头有7种号段:130、131、132、155、156、185、186。

电信手机号码开头有4个号段:133、153、180、189。

这样我们就可以在开头做事情了,先判断开头是不是上面的号段, regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\\\d{8}$",就是我们的元字符,代码如下:

import redef checkCellphone(cellphone):    regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\\\d{8}$"    result = re.findall(regex,cellphone)    if result:        print("匹配成功")        return True
    else:        print("匹配失败")        return Falsecellphone = '13717378202'checkCellphone(cellphone)


匹配成功True复制代码

匹配邮箱合法性

下面,我们进行一个作业,就是来匹配我们的邮箱号码。

作业的答案如下:

import redef checkEmail(email):    regex_1 = '^(\\\\w+)@sina.com$'
    regex_2 = '^(\\\\w+)@sina.com.cn$'
    regex_3 = '^(\\\\w+)@163.com$'
    regex_4 = '^(\\\\w+)@126.com$'
    regex_5 = '^[1-9][0,9]{4,}+@qq.com$'
    regex = [regex_1 ,regex_2 ,regex_3, regex_4, regex_5]
    for i in  regex:
        result = re.findall(i,email)
        if result:
            print("匹配成功")
            return True        else:
            print("匹配失败")
            return False
email = 'sdjflsdjkl@sina.com'checkEmail(email)复制代码

正则表达式测试工具

打开开源中国提供的正则表达式测试工具 tool.oschina.net/regex/,输入待匹…

例如,输入下面这段待匹配的文本:

Hello, my phone number is 123455678 and email is runsen@qq.com, and my website is https://blog.csdn.net/weixin_44510615.复制代码

这段字符串中包含了一个电话号码和一个电子邮件,接下来就尝试用正则表达式提取出来,如图所示。

在网页右侧选择 “匹配 Email 地址”,就可以看到下方出现了文本中的 E-mail。如果选择 “匹配网址 URL”,就可以看到下方出现了文本中的 URL。是不是非常神奇?

相关免费学习推荐:python教程(视频)

以上是詳細講解 Python中的正規表示式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除