普通人有三件东西看不懂:医生的处方,道士的鬼符,程序员得正则表达式
- 正则表达式,又称规则表达式,英文名为Regular ,在代码中常简写为regex、regexp或RE,
- 是计算机科学的一个概念。
- 许多都支持利用正则表达式进行字符串操作。
- 例如,在Python中就内建了一个功能强大的正则表达式接口擎。
- 正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
- 正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
- 正则就是用有限的符号,处理表达无限的序列
- 正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
- 正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“”))
- 操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,
- 组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
- 正则表达式是一种,模式描述在搜索文本时要匹配的一个或多个字符串。
正则表达式即文本的高级匹配模式,提供搜索,替代,获取等功能。
本质是由一系列特属符号和字符 构成的字串,这个字串就是正则表达式。
python --->
re 模块 处理正则表达式
re.findall(pattern,string) 返回值 : 得到列表,将目标字串中能用正则匹配的内容放入列表
In [11]: re.findall("abc",'abcdefghabi')
In [12]: re.findall("成都",'成都的街头走一走')
In [14]: re.findall("ab|cd",'abcdefghabi')
Out[14]: ['ab', 'cd', 'ab']
In [18]: re.findall("w.o",'woo,wao is not wbo')
Out[18]: ['woo', 'wao', 'wbo']
In [20]: re.findall("^Jame","Jame,how are you")
In [23]: re.findall("py$","hello.py")
fo* ----> f fo fooooooooooooooooooo
In [31]: re.findall("ab*","abcdefae&65abbbbbbbb")
Out[31]: ['ab', 'a', 'abbbbbbbb']
In [33]: re.findall(".+py$","hello.py")
In [36]: re.findall("ab?","abcea,adsfabbbbbb")
Out[36]: ['ab', 'a', 'a', 'ab']
In [39]: re.findall("ab{3}","abcea,adsfabbbbbb")
ab{3,5} ---> abbb abbbb abbbbb
In [45]: re.findall("ab{3,5}","ab abbb abbbbabbbbbb")
Out[45]: ['abbb', 'abbbb', 'abbbbb']
In [46]: re.findall("[aeiou]","hello world")
[0-9] [a-z] [A-Z] [0-9a-z]
In [47]: re.findall("^[A-Z][a-z]*","Hello world")
匹配规则:匹配除了中括号中字符集字符之外的任意一个字符
In [50]: re.findall("[^0-9]+","hello1")
匹配规则: \d 匹配任意一个数字字符 [0-9]
In [52]: re.findall("1\d{10}","13717776561")
In [53]: re.findall("\D+","hello world")
In [54]: re.findall("\w+","hello$1")
In [55]: re.findall("\W+","hello$1")
In [59]: re.findall("\w+\s+\w+","hello world")
In [61]: re.findall("\S+","hello world")
Out[61]: ['hello', 'world']
In [63]: re.findall("\Ahi","hi,Tom")
In [2]: re.findall("is\Z",'This')
完全匹配 : 使用一个正则表达式可以匹配目标字符串的全部内容
In [6]: re.findall("\A\w{5}\d{3}\Z",'abcde123')
In [17]: re.findall(r"\bis\b",'This is a test')
a . [...] [^...] \d \D \w \W \s \S In [23]: re.findall("\[\d+\]",'abc[123]')
特点 : 对字符串中的内容不进行转义,即表达原始含义
In [39]: re.findall("\\w+@\\w+\\.cn",'lvze@tedu.cn')
Out[39]: ['lvze@tedu.cn']
In [40]: re.findall(r"\w+@\w+\.cn",'lvze@tedu.cn')
Out[40]: ['lvze@tedu.cn']
正则表达式的重复匹配,总是
尽可能多的向后
匹配内容。 贪婪 ---》 非贪婪(懒惰)
尽可能少的匹配内容 In [46]: re.findall(r"ab*?",'abbbbbbbbbb')
In [47]: re.findall(r"ab+?",'abbbbbbbbbb')
使用()可以为正则表达式
建立子组,子组
不会影响正则 表达式整体的匹配内容,可以被看做是一个
内部单元。 In [52]: re.search(r"(ab)+",'abababab').group()
re.search(r"\w+@\w+\.(com|cn)",'Python@tedu.cn').group()
re.search(r"\w+@\w+\.(com|cn)",'lvze@tedu.com').group(1)
* 一个正则表达式中可以有多个子组,区分第一,第二。。。子组
re.search(r"(?P<dog>ab)+",'abababab').group()
P<dog>ab)cd(?P=dog) ===> abcdab
In [69]: re.search(r"(?P<dog>ab)cdef(?P=dog)",'abcdefab').group()
2.
唯一性 除了匹配的目标内容,尽可能不会有不需要的 内容
3.
全面性 对目标字符串可能的情况要考虑全面不漏
regex = re.compile(pattern,flags = 0) re.findall(pattern,string,flags = 0) regex.findall(string,pos,endpos) pos,endpos : 截取目标字符串的起止位置进行匹 配,默认是整个字符串
re.split(pattern,string,flags = 0) re.sub(pattern,replace,string,max,flags) re.subn(pattern,replace,string,max,flags) re.finditer(pattern,string,flags) re.fullmatch(pattern,string,flags) re.match(pattern,string,flags) re.search(pattern,string,flags) groupindex 获取捕获组字典,键为组名值是第几组