当前位置: 首页 > 后端技术 > Python

12-Python正则表达式

时间:2023-03-26 17:58:05 Python

掌握了XPath和CSS选择器,为什么还需要学习正则表达式?正则表达式,用标准的正则表达式解析,一般把HTML当作普通文本,使用指定的格式匹配为相关文本,适用于小的文本片段,或者一串字符(比如电话号码,邮箱账号),或者HTML包含javascript代码,不能使用CSS选择器或XPath在线正则表达式测试网站http://tool.oschina.net/regex...://docs.python.org/zh-cn/3/library/re.html理解正则表达式表达式正则表达式是字符串运算的逻辑公式。就是利用预先定义好的一些特定的字符,以及这些特定字符的组合,组成一个“规则串”。这个“规则字符串”用于表达字符串的过滤逻辑。正则表达式常用概念边界匹配^——匹配字符串开头,不匹配任何字符;$——匹配字符串结尾,不匹配任何字符;str="catabdcatdetfios"^cat:验证行以c开头,后跟a,然后是tios$:验证行以t结尾,倒数第二个字符是a,倒数第三个字符是c^cat$:以c开头,后面是a->t然后是行End:只有cat三个字母的数据行^$:end紧跟在beginning之后:空行,不包括任何字符^:开头的行,可以匹配任意行,因为每一行都有一行以b开头——匹配一个词边界,也就是一个词和一个空格之间的位置,不匹配任何字符;"er\b"可以匹配"never"中的"er",但不能匹配"verb"中的"er"。B——取反b,即匹配一个非词边界;“er\B”可以匹配“verb”中的“er”,但不能匹配“never”中的“er”。量词的贪婪和非贪婪正则表达式通常用于在文本中查找匹配的字符串。Python中的量词默认是贪婪的(或者在一些语言中默认是非贪婪的),总是试图匹配尽可能多的字符;非贪婪则相反,总是试图匹配尽可能少的字符。例如:如果使用正则表达式“ab*”查找“abbbc”,将查找“abbb”。而如果非贪婪量词“ab*?”使用时,将找到“a”。反斜杠问题与大多数编程语言一样。正则表达式使用“”作为转义字符,这可能会导致反斜杠问题。如果需要匹配文本中的字符“”,则在编程语言表达的正则表达式中需要4个反斜杠“\”:前两个和后两个在编程语言中用于转义成反斜杠斜杠,转换为两个反斜杠,然后在正则表达式中转义为一个反斜杠。Python中的原生字符串很好地解决了这个问题,本例中的正则表达式可以用r""表示。同样,匹配数字的“d”可以写成r“d”。有了原生字符串,再也不用担心漏掉反斜杠,写出来的表达方式更直观。importrea=re.search(r"\\","ab123bb\c")printa.group()\a=re.search(r"\d","ab123bb\c")printa.group()1PythonRe模块Python自带re模块,提供对正则表达式的支持。匹配函数re.match尝试从字符串的开头匹配模式。如果一开始匹配不成功,则match()返回none。下面是这个函数的语法:re.match(pattern,string,flags=0)这里的参数说明:参数说明pattern这是一个匹配的正则表达式。string这是字符串,将在字符串的开头搜索匹配模式。flags标志用于控制正则表达式的匹配方式,如:是否区分大小写、多行匹配等。re.match方法如果匹配成功则返回一个匹配对象,否则返回没有任何。我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式。匹配对象方法说明group(num=0)该方法返回整个匹配(或指定组num)比狗还聪明"matchObj=re.match(r'(.*)are(.*?).*',line,re.M|re.I)ifmatchObj:print("matchObj.group():",matchObj.group())print("matchObj.group(1):",matchObj.group(1))print("matchObj.group(2):",matchObj.group(2))else:print("Nomatch!!")当执行上面的代码时,它会产生以下结果:matchObj.group():CatsaresmarterthandogsmatchObj.group(1):CatsmatchObj.group(2):smarterregexmodifiers-optionflagsregexA公式文字可以包含一个可选的修饰符来控制匹配的各个方面。修饰符被指定为可选标志。可以使用XOR提供多个修饰符(|),如前所示,并且可以用以下之一表示:修饰符描述re.I
(re.IGNORECASE)使匹配不区分大小写re.M
(MULTILINE)多行匹配,影响^和$re.S
(DOTALL)makes。匹配包括换行符在内的所有字符re.X
(VERBOSE)正则表达式模式可以是多行,忽略空白字符,可以添加注释。findall()函数re.findall(pattern,string,flags=0)返回字符串中所有模式的非重叠匹配项,作为字符串列表。从左到右扫描字符串,并按照找到的顺序返回匹配项默认值:pattren="\w+"target="helloworld\nWORLDHELLO"re.findall(pattren,target)['hello','world','WORLD','HELLO']re.I:re.findall("world",target,re.I)['world','WORLD']re.S:re.findall("world.WORLD",target,re.S)["world\nworld"]re.findall("hello.*WORLD",target,re.S)['helloworld\nWORLD']re.M:re.findall("^WORLD",target,re.M)["WORLD"]re.X:reStr='''\d{3}#areacode-\d{8}'''#numberre.findall(reStr,"010-12345678",re.X)["010-12345678"]搜索函数re.search扫描整个字符串并返回第一个成功的匹配项。下面是函数语法:re.search(pattern,string,flags=0)这里的参数说明:参数说明pattern这是一个匹配的正则表达式。string这是字符串,将搜索它以匹配字符串中任何位置的模式。flags标志用于控制正则表达式的匹配方式,如:是否区分大小写、多行匹配等。re.search方法如果匹配成功则返回一个匹配对象,否则返回没有任何。我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式。匹配对象方法说明group(num=0)该方法返回整个匹配(或指定组num)比狗还聪明”;searchObj=re.search(r'(.*)are(.*?).*',line,re.M|re.I)ifsearchObj:print("searchObj.group():",searchObj.group())print("searchObj.group(1):",searchObj.group(1))print("searchObj.group(2):",searchObj.group(2))else:print"Nothing成立!!”执行上述代码时,会产生以下结果:matchObj.group():CatsaresmarterthandogsmatchObj.group(1):CatsmatchObj.group(2):differencebetweensmarterre.matchandre.searchre.matchOnly匹配字符串的开头。如果字符串开头与正则表达式不匹配,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到匹配项。例子:importreline="猫比狗聪明";matchObj=re.match(r'dogs',line,re.M|re.I)ifmatchObj:print("匹配-->matchObj.group():",matchObj.group())else:print("不匹配!!")searchObj=re.search(r'dogs',line,re.M|re.I)ifsearchObj:print("search-->searchObj.group():",searchObj.group())else:print("Nothingfound!!")当上面的代码执行时,产生如下结果:Nomatch!!search-->matchObj.group():dogsSearchandReplacePython的re模块提供了re.sub用于替换字符串中的匹配项。语法re.sub(pattern,repl,string,max=0)返回一个字符串,该字符串被替换为字符串中RE的最左边的非重复匹配项。如果未找到模式,则字符将原封不动地返回。可选参数count是模式匹配后的最大替换次数;count必须是一个非负整数。默认值为0以替换所有匹配项。例子:下面是一个爬虫翻页的例子:importreurl="http://hr.tencent.com/position.php?&start=10"page=re.search('start=(\d+)',url).group(1)nexturl=re.sub(r'start=(\d+)','start='+str(int(page)+10),url)print("NextUrl:",nexturl)执行上述代码时,会产生如下结果:NextUrl:http://hr.tencent.com/position.php?&start=20正则表达式语法下表列出了Python中可用的正则表达式语法:Online练习:https://www.520mg.com/it