美文网首页
正则表达式(1):语法

正则表达式(1):语法

作者: _百草_ | 来源:发表于2022-07-07 09:43 被阅读0次

1. 简介

正则表达式regular Expression是一种文本模式,包括普通字符和特殊字符(即元字符)
正则表达式使用单个字符串来描述、匹配一系列某个句法规则的字符串

作用:
  • 测试字符串内的模式;如数据验证,输入是否符合电话号码模式
  • 替换文本
  • 基于模式匹配从字符串中提取子字符串

2. 语法

  • 普通字符
    [abc] 匹配[]中所有字符
    [^abc]匹配除[]外其他所有字符
    [A-Z]表示一个区间,匹配所有大写字母,[a-z]表示所有小写字母
    . 匹配除换行符号\n \r之外的任何单个字符,相当于[^\n\r]
    [\s\S]匹配所有。\s匹配所有空白符,包括换行;\S非空白符,不包括换行
    \w 匹配字母、数字、下划线,等价于[A-Za-z0-9_]

  • 非打印字符

  • 特殊字符
    ^ 匹配输入字符串的开始位置
    $ 匹配结尾;若匹配字符本身,则使用\
    ()标记一个子表达式的开始和结束位置;若匹配(),则使用( )
    * 匹配前面的子表达式零次或多次
    + 匹配前面的子表达式一次或多次
    .匹配除换行符\n之外的任何单字符
    匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
    \将下一个字符标记为特殊字符或原义字符、或向后引用、或八进制转义符
    |指两项之间的一个选择

  • 限定符
    * 匹配前面子表达式零次或多次
    +匹配亲密子表达式一次或多次
    匹配前面子表达式零次或一次
    {n} n是非负整数。匹配确定的n次
    {n,} n是非负整数。至少匹配n次
    {n, m}n,m是非负整数,n<=m。最少匹配n次,且最多匹配m次

  • 贪婪模式&非贪婪模式
    * +限定符,是贪婪的,即尽可能多的匹配文字
    ,在贪婪模式后添加,就可以实现非贪婪或最小匹配

  • 定位符
    ^ 匹配输入字符串开始位置
    $ 匹配输入字符串结束位置
    \b 匹配一个单词边界,即字与空格间的位置
    \B 非单词边界匹配
    注:定位法与限定符不能一起使用;如^*

  • 选择
    用圆括号()将所有选项括起来,相邻的选项之间用|分隔
    ()表示捕获分组,()会把每个分组里的匹配的值保存起来,多个匹配值可以通过数字n来查看(n从1开始)

  • 反向引用

import re
s = "Abc123df1ac!\r@#$^&\n——_"
# patt = r"[0-9]+"  # 找出数字  # ['123', '1']
# patt = "[abc]"  # 匹配[]中所有字符  ['b', 'c', 'a', 'c']
# patt = '[^abc]'  # 匹配除[]外其他所有字符  ['A', '1', '2', '3', 'd', 'f', '1', '!', '\r', '@', '#', '$', '^', '&', '\n']
# patt = '[A-Z]'  # 匹配大写字母 ['A']
# patt = '.'  # 除\n和\r外的任何单一字符 ['A', 'b', 'c', '1', '2', '3', 'd', 'f', '1', 'a', 'c', '!', '@', '#', '$', '^', '&']
# patt = r"[\s\S]"  # 匹配所有
# patt = r"\w+"  # 匹配字母、数字、下划线  ['Abc123df1ac', '_']
# s = "13789001234"
# patt = r"^1[3-9]\d{9}$"  # 国内手机号码的正则校验

# ----贪婪模式&非贪婪模式
s = "<h1>RUNOOB-菜鸟教程</h1>"
patt = "<.*>"  # 贪婪模式:['<h1>RUNOOB-菜鸟教程</h1>']
patt = "<.*?>"  # 非贪婪模式:['<h1>', '</h1>']

# -----定位符
s = "How are you,Chapter ter?"
patt = r"\bCha*"  # ['Cha'] 匹配单词 Chapter 的开头三个字符
# patt = r"ter\b"  # ['ter', 'ter'] 匹配单词结尾的ter
# res = re.findall(patt, s)
# print(res)

# -----分组
s = "http://www.runoob.com:80/html/html-tutorial.html"
patt = r"(\w+):\/\/([^/:]+):(\d*)?([^# ]*)"
res = re.match(patt, s)
print(res)  # <re.Match object; span=(0, 48), match='http://www.runoob.com:80/html/html-tutorial.html'>
print(res.group(1))  # http 协议
print(res.group(2))  # www.runoob.com 表示域
print(res.group(3))  # 80 表示端口
print(res.group(4))  # /html/html-tutorial.html  表示页信息,或web地址指定路径

参考:https://www.runoob.com/regexp/regexp-tutorial.html

相关文章

网友评论

      本文标题:正则表达式(1):语法

      本文链接:https://www.haomeiwen.com/subject/vifreltx.html