字符串–re 模块
Regular expression
re.match(p,text) #从头开始匹配
re.search(p,text)#只要满足都可以匹配
比如
>>> import re
>>> text = 'c++ python2 python3 java rerl ruby lua java script php4 php7 c'
>>> re.match(r'java',text) #从头找没有找到 返回 null
>>> re.search(r'java',text) #找到了返回一个对象
<_sre.SRE_Match object at 0x10280aed0>
>>>
>>> m=re.search(r'java',text)
>>> m.start()
20
>>> m.end()
24
>>>
>>> m.group()
'java'
上面两个都是只返回一个,如果要匹配 c++ 因为 +号是特殊字符,所以需要转义
>>> re.match(r'c++',text)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 141, in match
return _compile(pattern, flags).match(string)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 251, in _compile
raise error, v # invalid expression
sre_constants.error: multiple repeat
>>> re.match(r'c\+\+',text)
<_sre.SRE_Match object at 0x10280aed0>
>>>
我们接下来继续看
re.findall(p,text) # 匹配所有
re.split(p,text)
比如查询所有的 Python
>>> re.findall(r'python',text)
['python', 'python']
>>>
split 是把查到的内容切分开,比如下面text包含了2个 java,那么 split 查找到 java 就会把左边的和右边的分开。
>>> text = 'c++ python2 python3 java rerl ruby lua java script php4 php7 c'
>>> re.split(r'java',text)
['c++ python2 python3 ', ' rerl ruby lua ', ' script php4 php7 c']
sub 是替换吧 a 替换成 b
>>> re.sub(r'java',r'hello',text)
'c++ python2 python3 hello rerl ruby lua hello script php4 php7 c'
正则
1、“.” 匹配一个字符
>>> print re.findall(r'^c..',text)
['c++']
>>> print re.findall(r'^c.',text)
['c+']
>>> print re.findall(r'^c',text)
['c']
2、”+” 和”[]” ,”[]”是或的意思,“+”是1到正无穷
>>> print re.findall(r'p+',text)
['p', 'p', 'p', 'p', 'p', 'p', 'p']
>>> print re.findall(r'p[a-zA-Z]',text)
['py', 'py', 'pt', 'ph', 'ph']
>>> print re.findall(r'p[a-zA-Z]+',text)
['python', 'python', 'pt', 'php', 'php']
3、”*” 是0到正无穷
>>> print re.findall(r'p[a-zA-Z]*',text)
['python', 'python', 'pt', 'php', 'php']
4、”?” 是0到1个
>>> print re.findall(r'p[a-zA-Z]?',text)
['py', 'py', 'pt', 'ph', 'p', 'ph', 'p']
>>>
5、 “{}” 表示重复次数,比如下面表示匹配重复4个字母以上的
>>> print re.findall(r'p[a-zA-Z]{4,}',text)
['python', 'python']
6、非用”^”表示
>>> print re.findall(r'c[a-zA-Z]*',text)
['c', 'cript', 'c']
>>> print re.findall(r'c[^a-zA-Z]*',text)
['c++ ', 'c', 'c']
7、或
>>> print re.findall(r'[pj][a-zA-Z]+',text)
['python', 'python', 'java', 'java', 'pt', 'php', 'php']
上面的方式用“|”来写就是这样的
>>> print re.findall(r'p[a-zaA-Z]+|j[a-zA-Z]+',text)
['python', 'python', 'java', 'java', 'pt', 'php', 'php']
>>>
如果是指在 j 前面加,则效果如下,这并不是我们想要的结果
>>> print re.findall(r'p|j[a-zA-Z]+',text)
['p', 'p', 'java', 'java', 'p', 'p', 'p', 'p', 'p']
8、匹配空格 p[^0-9]+
会匹配非数字,但是空格也算进去了,所以如果要去掉空格 p[^0-9 ]+
需要这样写
>>> print re.findall(r'p[^0-9]+|j[a-zA-Z]+',text)
['python', 'python', 'java', 'java', 'pt php', 'php']
>>> print re.findall(r'p[^0-9 ]+|j[a-zA-Z]+',text)
['python', 'python', 'java', 'java', 'pt', 'php', 'php']
>>>
9、匹配数字和字母 \w
表示匹配所有字符 \d
表示匹配数字
>>> print re.findall(r'p\w+\d+',text)
['python2', 'python3', 'php4', 'php7']
10、 “\b” 单词边界,表示出现在单词的开头
>>> print re.findall(r'p[^0-9]\b',text)
['pt']
>>> print re.findall(r'\bp[^0-9]+',text)
['python', 'python', 'php', 'php']
贪婪模式和非贪婪模式
“*” 和”+” 都是尽可能匹配到越多越好,如果加?就是匹配的尽可能少
>>> print re.findall(r'p[a-z]*',text)
['python', 'python', 'pt', 'php', 'php']
>>> print re.findall(r'p[a-z]*?',text)
['p', 'p', 'p', 'p', 'p', 'p', 'p']
>>> print re.findall(r'p[a-z]+?',text)
['py', 'py', 'pt', 'ph', 'ph']
>>> print re.findall(r'p[a-z]+\b',text)
['pt']
>>> print re.findall(r'p[a-z]+?\b',text)
['pt']
分组
根据字母和数字分组
>>> a = re.search(r'(p[a-zA-Z]+)([0-9])','python2')
>>> print a.group(1)
python
>>> print a.group(2)
2
设置分组名称
>>> a = re.search(r'(?P<name>p[a-zA-z]+)(?P<version>[0-9])','python2')
>>> print a.group('name')
python
>>> print a.group('version')
2
pattern
>>> pattern = re.compile(r'(?P<name>p[a-zA-z]+)(?P<version>[0-9])')
>>> results = pattern.search('python2')
>>> print results.groupdict()
{'version': '2', 'name': 'python'}
>>> results = pattern.search('python3')
>>> print results.groupdict()
{'version': '3', 'name': 'python'}
>>> results = pattern.search('php3')
>>> print results.groupdict()
{'version': '3', 'name': 'php'}
for循环
>>> for t in text.split(' '):
... results = pattern.search(t)
... if results:
... print results.groupdict()
...
{'version': '2', 'name': 'python'}
{'version': '3', 'name': 'python'}
{'version': '4', 'name': 'php'}
{'version': '7', 'name': 'php'}
>>>
写规则
A.
>>> a = re.compile(r"""\d + $ 整数部分
... \. # 小数点
... \d * #小数部分
... """,re.X)
>>>
B.
>>> b = re.compile(r"\d+\.\d*")
>>>
A 和 B 其实是一个意思,但是 A 看起来更直观。