Python

数据过滤逻辑规则

正则表达式

代码示例:

import re  # 导入标准库函数re(正则表达式)

# 格式01:
Foo = re.compile('HQSY')  # 创建条件
Bar = Foo.match('HQSYFoo')  # 匹配条件,match:根据条件,从头匹配数据(匹配失败则返回None)
print(Bar)  # <re.Match object; span=(0, 4), match='HQSY'>(span:条件元素的起始位置加上条件搜索了几个字符数)

# 格式02:
Bar = re.match('HQSY','FOOHQSY')
print(Bar)  # None(因为开头不匹配)
print(Bar.span())  # span():仅显示结果的span部分(返回值:tuple)
print(Bar.group())  # group():仅显示结果的match部分(返回值:str)

Foo = re.search('HQSY','FOOHQSY')  # search:根据条件,从头到尾匹配数据(匹配失败则返回None)
print(Foo)  # <re.Match object; span=(3, 7), match='HQSY'>

Foo = re.search('[A-Z][0-9][a-z]', 'abH7S2ab')  # 过滤符合大写字母 + 数字 + 小写字母组合的数据
print(Foo.group())  # S2a

Foo = re.findall('[A-Z][0-9][a-z]','abH7S2abA1b')  # 过滤符合大写字母 + 数字 + 小写字母组合的全部数据(返回值:list)
print(Foo)  # ['S2a', 'A1b']

量词符号

字符注释
*匹配次数 >= 0
+匹配次数 >= 1
?0 <= 匹配次数 <= 1
{X}匹配X次
^开头
$结尾
{X,}匹配次数 >= X
{X,Y}X <= 匹配次数 <= Y

代码示例:

import re

Foo = re.findall('[A-Z][0-9]+[a-z]', 'abH7S2abA1b')
print(Foo)  # ['S2a', 'A1b']

Foo = re.match('[0-9]{4}', '1024HQSY')
print(Foo)  # <re.Match object; span=(0, 4), match='1024'>

Foo = re.match('[a-z]{2}$','hq')  # 'hq'('hqsy'则返回None)
print(Foo)  # <re.Match object; span=(0, 2), match='hq'>

Foo = re.match('[A-Za-z]{1,3}','HqSy')  # [A-Za-z](多类型范围)
print(Foo)  # <re.Match object; span=(0, 3), match='HqS'>

等价扩展

字符注释
\w[A-Za-z0-9_]
\W[^\w]
\b单词边界
\B非单词的边界
.\n以外的所有字符
\s[\t\n\r\f]
\S[^\s]
\d[0-9]
\D[^\d]

代码示例:

import re

Foo = re.findall(r'\w+.py\b', 'hqsy.py 1024.py')  # 因为加了r'',所以不用'\.'(反斜杠:防止转译,'\b'在字符串中有特殊的意思,所以要加r''变成正则表达式的意思)
print(Foo)  # ['hqsy.py', '1024.py']

分组操作

代码示例:

Foo = re.match(r'[1-9]\d$|[1-9]{2}\d$|100$','02')
print(Foo)  # None

Foo = re.match(r'\w{4,16}@(test|example).com$','1024@example.com')
print(Foo)  # <re.Match object; span=(0, 16), match='1024@example.com'>

Foo = re.match(r'(\d{3,4})-(\d{4})$','010-1024')
print(Foo.group(1))  # 第1个小括号内的结果(小括号:分组,取不到则报错)
print(Foo.group(2))
'''
010
1024
'''

Foo = re.match(r'<(\w+)>(.+)<(/\1)>$','<p>HQSY</p>')  # \1:引用第1个括号的条件匹配结果进行二次匹配
print(Foo)  # <re.Match object; span=(0, 11), match='<p>HQSY</p>'>

Foo = re.match(r'<(?P<name>\w+)>(.+)<(/(?P=name))>$','<p>HQSY</p>')  # ?P:给这个括号起名,(?P):引用引用指定括号的条件匹配结果进行二次匹配
print(Foo)  # <re.Match object; span=(0, 11), match='<p>HQSY</p>'>

Bar = '<p>HQSY</p>'
Foo = re.sub(r'>(.+)<','>1024<',Bar)  # sub:替换匹配的结果
print(Foo)
print(Bar)  # 源值不变
'''
<p>1024</p>
<p>HQSY</p>
'''

def foo(args):
    print(args)
    a = args.group()
    b = str(int(a) + 1)
    return b

Bar = re.sub(r'\d+',foo,'HQSY:1023')  # 可用函数逻辑处理匹配的结果
print(Bar)
'''
<re.Match object; span=(5, 9), match='1023'>
HQSY:1024
'''

Foo = re.split(r'[:]','HQSY:1024')  # split:根据条件切割数据
print(Foo)  # ['HQSY', '1024']

贪婪匹配与惰性匹配

  1. 贪婪匹配
    • 总是匹配尽可能多的字符
  2. 惰性匹配
    • 总是尝试匹配尽可能少的字符

代码示例:

Foo = re.match(r'abc\d+','abc123abc')  # 贪婪匹配
print(Foo)  # <re.Match object; span=(0, 6), match='abc123'>

Foo = re.match(r'abc\d+?','abc123abc')  # 惰性匹配
print(Foo)  # <re.Match object; span=(0, 4), match='abc1'>