正则表达式

正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

在正则表达式中,

若直接给出字符,就是精确匹配。

d    匹配一个数字,如 ‘00d’     可匹配 ‘004’ 而不能匹配 ‘00a’

w    匹配一个数字或字母 如 ‘wwd’    可匹配 ‘fg5’

.      可匹配任一字符,如 ‘py.’ 可匹配 ‘pyd’、‘py7’、‘py!’等

匹配变长字符,

* 表示任意个字符(含0个)

+ 表示至少一个字符

?表示0个或1个字符

{n}表示n个字符,{n,m}表示n到m个字符。

  例:d{3}s+d{3,8}  d{3}表示匹配3个数字;s表示匹配一个空格(含Tab等空白符),因此s+表示至少有一个空格;d{3,8}表示3-8个数字。若要匹配‘010-12345’,因为‘-’是特殊字符,在正则表达式中要用‘’转义,即d{3}-d{3,8}。但是,仍然无法匹配‘010 - 12345’,因为带有空格。需要更复杂的匹配方式。

[ ]表示范围:

[0-9a-zA-Z\_]          可匹配一个数字、字母或下划线

[0-9a-zA-Z\_]+           可匹配至少由一个数字、字母或下划线组成的字符串

[a-zA-Z\_] [0-9a-zA-Z\_]*        可匹配python的合法变量,即字母或下划线开头,后接任意个由字母、数字或下划线组成的字符串

[a-zA-Z\_] [0-9a-zA-Z\_] {0,19}  更精确限制了变量长度为1+{0,19}

A|B    可匹配A或B

^      表示行的开头,^d表示必须以数字开头

$     表示行的结束,d$表示必须以数字结束

re模块

 注意:python中字符串也用 转义,python字符串前建议加 r 

re.match(pattern, string, flags=0)

Try to apply the pattern at the start of the string, returning a match object, or None if no match was found.

In [312]: re.match('d{3}-d{3,8}','111-123')
Out[312]: <_sre.SRE_Match object; span=(0, 7), match='111-123'>

In [313]: re.match('d{3}-d{3,8}','111-123')
Out[313]: <_sre.SRE_Match object; span=(0, 7), match='111-123'>    #可见-和-都能匹配字符串中的-

 

In [324]: re.match('100','100')
Out[324]: <_sre.SRE_Match object; span=(0, 1), match='@'>

In [325]: re.match('\100','100')
Out[325]: <_sre.SRE_Match object; span=(0, 1), match='@'>

In [326]: re.match('\100','100')                     #只能三个\
Out[326]: <_sre.SRE_Match object; span=(0, 1), match='@'>
View Code

切分字符串:

re.split(pattern, string, maxsplit=0, flags=0)

返回切分后列表

In [348]: re.split(r'[s\,]+','a,b c  d')
Out[348]: ['a', 'b', 'c', 'd']

分组:

提取子串,用()表示的就是要提取的分组(Group)。如^(d{3})-(d{3,8})$分别定义了两个组,可从匹配的字符串中提取区号和本地号码:

In [27]: import re

In [28]: m = re.match(r'^(d{3})-(d{3,8})$','010-12345')

In [29]: m
Out[29]: <_sre.SRE_Match object; span=(0, 9), match='010-12345'>

In [30]: m.group(0)      #如果正则表达式中定义了组,可在match对象中用group()提取子串,参数无或0返回原始字符串,1、2、...表示第i个子串
Out[30]: '010-12345'      #也可用groups()提取所有子串构成的元组

In [31]: m.group(1)
Out[31]: '010'

In [32]: m.group(2)
Out[32]: '12345'

In [33]: m.group(3)
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-33-71a2c7935517> in <module>()
----> 1 m.group(3)

IndexError: no such group

贪婪匹配:

正则匹配默认是贪婪匹配,即匹配尽可能多的字符

In [53]: re.match(r'^(d+)(0*)$','102300').groups()
Out[53]: ('102300', '')

In [54]: re.match(r'^(d+?)(0*)$','102300').groups()
Out[54]: ('1023', '00')

 

渐变 --> 突变
原文地址:https://www.cnblogs.com/lybpy/p/7806911.html