python -- 正则表达式

简单匹配邮箱地址

匹配 huangkwell@163.com
正则表达式: [a-zA-Z]+@[1-9]{3}.com 或者 \w+@\d+.(com|cn)

概念

正则表达式(简称regex)是一些由字符和特殊符号组成的字符串,它们描述了模式的重复或者表述多个字符,于是正则表达式能按照某种模式匹配一系列有相似特征的字符串,简而言之,正则表达式能够匹配多个字符串。

常见正则表达式符号

表示法 描述 正则表达式示例
literal 匹配文本字符串字面值literal foo
rel1|rel2 匹配正则表达式rel1或rel2 foo|bar
. 匹配任何字符 b.b
^ 匹配字符串起始部分 ^abc
$ 匹配字符串终止部分 abc$
* 匹配0次或多次前面的正则表达式 [A-Z]*
+ 匹配1次或多次前面的正则表达式 [A-Z]+
? 匹配0次或1次前面的正则表达式 [A-Z]?
匹配N次前面的正则表达式 [A-Z]
匹配M~N次前面的正则表达式 [A-Z]
[...] 匹配中括号中的任意单一字符 [akdf]
[x-y] 匹配x~y范围中的任意单一字符 [0-9],[A-Za-z]
[^...] 不匹配此字符集中出现的任何一个字符 [aeiou],[A-Za-z0-9]
(...) 匹配封装的正则表达式,然后另存为子组 ([0-9]{3})?
\d 匹配任何十进制数字,与[0-9]一致(\d则相反,不匹配任何数字) data\d+.txt
\w 匹配任何字母数字字符,与[A-Za-z0-9]相同 [A-Za-z]\w+
\s 匹配任何空格 of\sthe
\b 匹配任何单词边界 \bTHE\b
\N 匹配已保存的子组N price:\16
\c 逐字匹配任何特殊字符c \.,\*
?P... 像一个仅由name标识而不是数字ID的正则分组匹配 (?P)

使用择一匹配符号匹配多个正则表达式模式

表示择一匹配的管道符号|,表示一个“从多个模式中选择其一”的操作

正则表达式模式 匹配的字符串
at | home at、home
r2d2 | c3po r2d2,c3po

使用圆括号指定分组

不仅需要知道整个字符串是否匹配,而也要知道特定子部分是否匹配

正则表达式模式 匹配的字符串
\d+(.\d*)? 匹配简单浮点数

re模块:

findall()

1 findall()  所有结果都返回到一个列表里 
	r2 = re.findall('asd', 'asdljdfasd')
	print(r2)
	
	返回结果:['asd', 'asd']

search(),需要使用group()

2 search()返回匹配到的一个对象,对象可以调用group()返回结果

	r2 = re.search('asd', 'aljdfasd')
	print(r2)
	print(r2.group())
	
	返回结果: 

	asd

match(),,需要使用group()

3 match()只在字符串开始匹配 

	r1 = re.match('asd','asdljdfasd')
	print(r1)
	print(r1.group())
	
	返回结果: 
	asd

split()

4 sp = re.split(':',"str1:str2:str3")
  print(sp)
  
  返回结果:['str1', 'str2', 'str3']

贪婪匹配与非贪婪匹配

patt = '.+(\d+-\d+-\d+).+'
data = 'haungke  2017-08-26 kwell'

s = re.search(patt,data)

print(s.group())
# haungke  2017-08-26 kwell

print(s.group(1))
# 7-08-26

第二个输出期望是2017-08-26,但结果却不对,因为正则表达式默认是贪心的,也就是说,如果正则表达式使用通配符,那它会尽量抓取满足匹配的最长字段,正则表达式中的".+"抓取了"huangke 201"

解决方法:使用非贪婪操作符"?"
它的作用是要求正则表达式引擎匹配的字符越少越好。

patt = '.+?(\d+-\d+-\d+).+'
data = 'haungke  2017-08-26 kwell'

s = re.search(patt,data)

print(s.group())
# haungke  2017-08-26 kwell

print(s.group(1))
# 2017-08-26
posted @ 2017-08-25 16:44  云石海涯  阅读(143)  评论(0编辑  收藏  举报