基础:Python 正则表达式

字符串–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 看起来更直观。

正则表达式参考https://awen.me/post/2907850497.html