字符串–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) >>> 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 sre_constants.error: multiple repeat >>> re.match(r'c\+\+',text) <_sre.SRE_Match object at 0x10280aed0> >>>
|
我们接下来继续看
比如查询所有的 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 看起来更直观。
正则表达式参考https://awen.me/post/2907850497.html
文章作者:阿文
版权声明:本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0 许可协议。转载请注明来自
阿文的博客!