regex正则表达式学习

正则表达式

动机1. 处理文本成为计算机常见工作之一2. 对文本内容的搜索提取是一项比较复杂困难的工作3. 为了快速方便处理上述问题,正则表达式技术诞生,主键发展为一个被众多语言使用的独立技术

定义:即高级文本匹配模式,提供了搜索,替代等功能。本质是由一系列特殊符号和字符组成的子串,这个子串即是正则表达式。这个表达式描述了字符和字符的重复行为,可以匹配一类特征的字符串。

目标:1. 熟练使用正则表达式符号2. 正确组合和理解一般的正则表达式3. 能够使用Python操作正则表达式

正则表达式特点* 方便进行检索和修改* 支持语言众多* 灵活多样* mongo正则类型,django等框架作为url匹配,爬虫

正则表达式的使用Python ----》 re模块 处理正则表达式

re.findall(pattern,string)功能 : 使用正则表达式匹配字符串参数 :  pattern 正则表达式         string  目标字符串返回值 : 一个列表  匹配到的所有内容

元字符 (即正则表达式中有特殊含义的符号)

1. 普通字符元字符 : abc匹配规则 : 匹配相应的普通字符

In [6]: re.findall("abc","abcdefghabcdhig")Out[6]: [‘abc‘, ‘abc‘]

2. 或 元字符 :  ab|cd匹配规则 : 匹配|两边任意一个正则表达式符合的情况In [7]: re.findall("ab|cd","abcdefghabcdhig")Out[7]: [‘ab‘, ‘cd‘, ‘ab‘, ‘cd‘]* |两侧不要有没用的空格

3. 匹配单一字符元字符 :  .匹配规则: 匹配除了换行之外的任意字符f.o---》 foo  fao  [email protected]

In [10]: re.findall("f.o","foo is not fao")Out[10]: [‘foo‘, ‘fao‘]

4. 匹配开始位置元字符: ^匹配规则: 匹配一个字符串的开始位置^Hello  ---> Hello world  : Hello

In [14]: re.findall("^hello","hello world")Out[14]: [‘hello‘]

5. 匹配结束位置元字符: $匹配规则:匹配目标字符串的结束位置py$  --->  hello.py

In [16]: re.findall("py$","hello.py")Out[16]: [‘py‘]

6. 匹配重复元字符 :  *匹配规则: 匹配前面的正则表达式重复0次或多次fo* ---》 fo  foo  foooooooo   f

In [19]: re.findall("ab*","abbcdef")Out[19]: [‘abb‘]

7. 匹配重复元字符 :  + 匹配规则: 匹配前面的正则表达式重复1次或多次

ab+   ---》   ab  abbb  abbbbIn [23]: re.findall(".+py$","hello.py")Out[23]: [‘hello.py‘]

8. 匹配重复元字符:   ?匹配规则: 匹配前面的正则表达式重复0次或1次ab? -->   a   ab

In [24]: re.findall("ab?","abcdefa")Out[24]: [‘ab‘, ‘a‘]

9. 匹配重复元字符:  {n}匹配规则 : 匹配指定的重复次数ab{3} --->  abbbIn [25]: re.findall("ab{3}","abbbbbbbb")Out[25]: [‘abbb‘]

10. 匹配重复元字符 :  {m,n}匹配规则 : 匹配前面的正则表达式重复 m次 到 n次ab{3,5}  abbb  abbbb abbbbbIn [26]: re.findall("ab{2,5}","abcdabbbabbbbbb")Out[26]: [‘abbb‘, ‘abbbbb‘]

11. 匹配字符集合元字符:  []匹配规则 :  匹配括号范围内的任意一个字符[abc123d]  a b c 1 2 3 d[a-z]  [A-Z][0-9][123a-zA-Z]In [31]: re.findall("[_0-9a-zA-Z]","Hello world 123")

12. 匹配字符集合元字符: [^...]匹配规则 : 匹配除指定字符集之外的任意字符

In [34]: re.findall("[^abc]","nihao abc")Out[34]: [‘n‘, ‘i‘, ‘h‘, ‘o‘, ‘ ‘]

13. 匹配任意(非)数字字符元字符:  \d    \D匹配规则 : \d 匹配任意数字字符   \D  匹配任意非数字字符             [0-9]                 [^0-9]

In [35]: re.findall("1\d{10}","17611665537")Out[35]: [‘17611665537‘]

14. 匹配(非)普通字符  (普通字符: 数字字母下划线)元字符 : \w            \W匹配规则:  \w 匹配任意一个普通字符  \W匹配任意非普通字符          [_0-9a-zA-Z]              [^_0-9a-zA-Z]

In [39]: re.findall("\w+","hello$1")Out[39]: [‘hello‘, ‘1‘]

In [40]: re.findall("\W+","hello$1")Out[40]: [‘$‘]

15. 匹配(非)空字符元字符 :  \s      \S匹配规则:\s 匹配任意空字符    \S 匹配任意非空字符          [ \n\t\r]

In [45]: re.findall("\s",‘hello world\r\n\t\0‘)Out[45]: [‘ ‘, ‘\r‘, ‘\n‘, ‘\t‘]

16. 匹配起止位置元字符:   \A     \Z匹配规则 : \A匹配开始位置    \Z匹配结束位置             ^                 $绝对匹配  \Aabc\Z  ----> abc (且字符串只是abc)

In [48]: re.findall("\A/\w+/\w+\Z",‘/football/zhongchao‘)Out[48]: [‘/football/zhongchao‘]

17. 匹配(非)单词边界位置元字符: \b     \B匹配规则 : \b 匹配单词的边界    \B匹配非单词的边界

单词边界 : 数字字母下划线和其他字符的交界位置为单词的边界

abc_1 haha

In [55]: re.findall(r"\Bis\b",‘This is a test‘)Out[55]: [‘is‘]

元字符总结

匹配单个字符:a  .  \d  \D   \w  \W  \s  \S  [...]  [^...]匹配重复性 : *   +   ?  {N}  {m,n}匹配某个位置 : ^   $   \A  \Z   \b  \B其他 :  |   ()  \

练习匹配长度8-10位的密码 必须以数字开头,数字字母下划线组成^[0-9]\w{7,9}$

转义字符

正则表达式特殊符号 : .   *   ?   $  ‘‘   ""   []  {}  ()   \  ^ 如果想匹配特殊符号则加转义

\"\.\"   ----->  "."

r ---> raw  原生字符串 : 不进行转义

In [64]: re.findall(r"\bis",‘This is‘)Out[64]: [‘is‘]

贪婪和非贪婪

正则表达式默认的重复匹配模式 : 贪婪模式尽可能多的向后匹配

*  +   ?  {m,n}  这四种情况下会产生贪婪模式

非贪婪模式 : 尽可能少的匹配内容,满足正则表达式含义即可

贪婪---》非贪婪   *?   +?  ??  {m,n}?

In [70]: re.findall("ab*?",‘abbbbbbbbcded‘)Out[70]: [‘a‘]

In [71]: re.findall("ab+?",‘abbbbbbbbcded‘)Out[71]: [‘ab‘]

正则表达式分组

使用()可以为一个正则表达式建立一个子组,子组可以看做内部的整体abcdef ----》 http://www.baidu.com

子组的作用1. 增加子组后对正则表达式整体的匹配内容没有影响2. 子组可以改变重复元字符的重复行为3. 子组在某些操作中可以对子组匹配内容单独提取

子组的注意事项1.每个正则表达式可以有多个子组,由外到内由左到右为第一第二。。。。子组2.子组通常不要交叉

捕获组和非捕获组(命名组和非命名组)子组命名格式(?P<name>abc)1.很多编程接口可以直接通过名字获取子组匹配内容2.捕获组中的正则表达式可以通过名字重复调用(?P=name)

(?P<dog>ab)cdef(?P=dog) -----> abcdefab

In [83]: re.search(‘(ab)+‘,‘ababababab‘).group()Out[83]: ‘ababababab‘

In [84]: re.search(‘(?P<dog>ab)cdef(?P=dog)‘,‘abcdefabcde‘).group()Out[84]: ‘abcdefab‘

匹配身份证号\d{17}(\d|x)

re模块

obj = compile(pattern,flags = 0)功能: 获取正则表达式对象参数: pattern : 正则表达式       flags: 功能标志位,提供更丰富的匹配返回值 : 正则表达式对象

re模块和compile对象均有的函数

obj.findall(string,pos,endpos)功能 : 通过正则表达式匹配字符串参数 : string  目标字符串        pos  目标字符串的匹配开始位置   endpos 目标字符串的结束位置返回值 : 匹配到的所有内容以列表返回

* 如果正则表达式有子组则只显示子组匹配内容

obj.split(string)功能 : 按照正则表达式切割目标字符串参数 : 目标字符串返回值 : 切割后的内容

obj.sub(replaceStr,string,max)功能: 替换正则表达式匹配到的内容参数: replaceStr 要替换的内容        string  目标字符串       max   最多替换几处返回值 : 返回替换后的字符串

subn(repl,string,count)功能: 替换正则表达式匹配到的内容参数: repl 要替换的内容        string  目标字符串       count   最多替换几处返回值 : 返回替换后的字符串和实际替换的个数

re.finditer(pattern,string)功能  : 使用正则表达式匹配目标内容参数  :  目标字符串返回值 : 迭代对象 迭代的每个内容为一个match对象

re.match(pattern,string)功能 : 匹配一个字符串的开头参数 : 目标字符串返回值 : 如果匹配到返回 match obj          没有匹配到返回 None

re.search(pattern,string)功能 : 匹配一个字符串参数 : 目标字符串返回值 : 如果匹配到返回 match obj          没有匹配到返回 None* match 只能匹配字符串的开头位置,search可以匹配任意位置,但是也只能匹配一处* 通常match对象调用其属性时往往需要try异常处理

fullmatch()要求目标字符串完全匹配

compile 对象特有属性(re模块没有)flags : 标志位pattern : 正则表达式groupindex  : 捕获组形成的字典groups : 多少个子组

match 对象属性方法

print(match_obj.pos)  #目标字符串开头位置print(match_obj.endpos) # 目标字符串结束位置print(match_obj.re)  # 正则表达式对象print(match_obj.string) # 目标字符串print(match_obj.lastgroup) # 最后一组的名字print(match_obj.lastindex) # 最后一组是第几组

span()     匹配到内容的起止位置start()  匹配到内容的开始位置end()   匹配到内容的结束位置

group(n)功能 : 获取match 对象匹配的内容参数 : 默认为0 表示获取正则整体的匹配内容        如果传入大于0的正数则表示获取对应子组匹配内容返回值:返回匹配到的内容

groups()功能 : 得到所有子组匹配的内容

groupdict()功能 :得到所有捕获组匹配的内容

作业 : 读取一个文件的内容 ,将文件中所有的以大写字母开头的单词匹配出来

原文地址:https://www.cnblogs.com/wcin/p/9119288.html

时间: 2024-10-09 16:08:35

regex正则表达式学习的相关文章

RegEx正则表达式学习笔记

一.实用的例子 1 public static void main(String[] args) { 2 // 简单练习 3 System.out.println("-123".matches("-?\\d+")); 4 System.out.println("+5678".matches("(-|\\+)?\\d+")); 5 // QQ号 6 System.out.println("174678839431&qu

Python正则表达式学习摘要及资料

摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2,4}? 只匹配 2 个 a. ^表示行的开头,^\d表示必须以数字开头. $表示行的结束,\d$表示必须以数字结束. 你可能注意到了,py也可以匹配'python'-->py;但是加上^py$就变成了整行匹配,就只能匹配'py'了,匹配'python'时,就什么也得不到. 参考表 正则表达式特殊序

正则表达式学习笔记---揭开正则表达式的神秘面纱

正则表达式学习笔记 如果我们问那些UNIX系统的爱好者他们最喜欢什么,答案除了稳定的系统和可以远程启动之外,十有八九的人会提到正则表达式:如果我们再问他们最头痛的是什么,可能除了复杂的进程控制和安装过程之外,还会是正则表达式.那么正则表达式到底是什么?如何才能真正的掌握正则表达式并正确的加以灵活运用?本文将就此展开介绍,希望能够对那些渴望了解和掌握正则表达式的读者有所助益. 入门简介 简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具.我们可以在几乎所有的基于UNIX系统的工具中找到

Python 正则表达式学习摘要及资料

来源:Michael_翔_ 摘要 在正则表达式中,如果直接给出字符,就是精确匹配. {m,n}? 对于前一个字符重复 m 到 n 次,并且取尽可能少的情况 在字符串'aaaaaa'中,a{2,4} 会匹配 4 个 a,但 a{2,4}? 只匹配 2 个 a. ^表示行的开头,^\d表示必须以数字开头. $表示行的结束,\d$表示必须以数字结束. 你可能注意到了,py也可以匹配'python'–>py; 但是加上^py$就变成了整行匹配,就只能匹配'py'了,匹配'python'时,就什么也得不到

正则表达式学习参考

正则表达式学习参考 1       概述 正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征. 正如自然语言中“高大”.“坚固”等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征. 正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持,并根据自身语言的特点,进行一定的剪裁或扩展. 正则入门很容易,有限的语法规则很容易掌握,但是目前正则的普及率并不高,主要是因为正则的流派众多,各种

正则表达式学习-JavaScript RegExp 对象

W3School 中有关于正则表达式的全面介绍:http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp 1.什么是正则表达式?正则表达式有什么用? 知道正则表达式有什么用,是学习它的最好动力. 正则表达式跟平时用的字符串操作功能函数类似.功能比它强大很多. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过

转:C++ Boost/tr1 Regex(正则表达式)快速指南

C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适用于其他版本的Boost.对namespace稍加修改,即可适用tr1标准. 0.regex对象 类似于Java中的Pattern,Boost中的正则表达式对象为: boost::regex 常见构造方法2种: 1 2 3 4 5 // 1. 直接使用正则表达式的字符串构造. boost::rege

pyqt学习基础 4 -插曲- python 正则表达式学习

python 正则表达式学习 资源来自 学习资源来自ubuntu wiki 正则表达式介绍 正则表达式,各种语言都有相关的库.就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言 简单模式 字符匹配 _大多数_字母和字符一般都会和自身匹配.例如,正则表达式 test 会和字符串"test"完全匹配. 正则表达式使用一些元字符来帮助字符匹配: . ^ $ * + ? { [ ] \ | ( ) "[" 和 "]" "[&

Js正则表达式学习之test和compile的简单介绍

RegExp 对象用于规定在文本中检索的内容. 定义 RegExp RegExp 对象用于存储检索模式. 通过 new 关键词来定义 RegExp 对象.以下代码定义了名为 patt1 的 RegExp 对象,其模式是 "e": test方法如下 var patt1=new RegExp("e"); RegExp 对象有 3 个方法:test().exec() 以及 compile(). patt1.test("the best things in lif