#coding:utf-8
import re #python正则表达式的模块
text="hi,hiasdf"
m = re.findall("\\bhi",text) #r是raw的意思,表示对字符串不进行转义,若不加r,输出的    一直为空,因为\将后面的b转义了,要是不写r则写成\\b
print m #输出结果为['hi', 'hi']

re是python里的正则表达式模块。findall是其中一个方法,用来按照提供的正则表达式,去匹配文本中的所有符合条件的字符串。返回结果是一个包含所有匹配的list。

compile函数,例子,利用compile,生成一个pattern对象然后能直接用该对象匹配

>>> import re
>>> pattern = re.compile(r'\d+')                    # 用于匹配至少一个数字
>>> m = pattern.match('one12twothree34four')        # 查找头部,没有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
>>> print m                                         # 返回一个 Match 对象
<_sre.SRE_Match object at 0x10a42aac0>
>>> m.group(0)   # 可省略 0
'12'
>>> m.start(0)   # 可省略 0
3
>>> m.end(0)     # 可省略 0
5
>>> m.span(0)    # 可省略 0
(3, 5)

单行模式下,点号.也能匹配换行符

q = re.match(r'This.*line\.', a, flags=re.DOTALL)

多行模式 re.MULTILINE

在正常情况下,行首符^和行尾符$仅仅匹配整个字符串的起始和结尾,在多行模式下,^除了匹配整个字符串的起始位置,还匹配换行符后面的位置;$除了匹配整个字符串的结束位置,还匹配换行符前面的位置。如果^在方括号内使用,则表示不匹配该字符

re.findall(r'^This.*line\.$', a, flags=re.MULTILINE) //当文本出现跨行匹配时,单        行和多行尤为重要

“\b”在正则表达式中表示单词的开头或结尾,空格、标点、换行都算是单词的分割

[]表示满足括号中任一字符。比如“[hi]”,它就不是匹配“hi”了,而是匹配“h”或者“i”。如果把正则表达式改为“[Hh]i”,就可以既匹配“Hi”,又匹配“hi”了。

数字简化的写法:[0-9],\d。类似的还有[a-zA-Z]的用法。

  要表示任意长度的数字,就可以用  [0-9]  或者   \d

  但要注意的是,表示的任意长度包括0,也就是没有数字的空字符也会被匹配出来。一个与类似的符号+,表示的则是1个或更长。

  所以要匹配出所有的连续的数字串,应当用  [0-9]+  或者  \d+

  \d{11} 匹配11位数字       1\d{10}  匹配开头为1的11位数字

匹配除换行符以外的所有字符是用“.”表示,而“*”则不是表示字符,而是表示数量:它表示前面的字符可以重复任意多次(包括0次)

“\S”,它表示的是不是空白符的任意字符

“\s” 匹配任何空白字符,包括空格、制表符、换页符等等

”?“ 表示任意一个或零个字符

比如Hi, I am Shirley Hilton. I am his wife.

用“I.*e”去匹配,得到[‘I am Shirley Hilton. I am his wife’] 贪婪匹配–匹配尽可能长的

用“I.*?e”匹配,得到[‘I am Shirle’, ‘I am his wife’]    懒惰匹配匹配尽可能短的

从下面一段文本中,匹配出所有s开头,e结尾的单词。

site sea sue sweet see case sse ssee loses

答案\bs\S*e\b

注意不是\bs.*?e\b

既然是单词,我们就不要空格,所以需要用”\S”而不是”.”