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']
贪婪匹配与惰性匹配
- 贪婪匹配
- 总是匹配尽可能多的字符
- 惰性匹配
- 总是尝试匹配尽可能少的字符
代码示例:
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'>