资讯专栏INFORMATION COLUMN

正则表达式

whlong / 1751人阅读

摘要:扫描字符串开头扫描整个字符串,返回第一个匹配成功的结果返回所有结果的列表,失败返回空列表返回迭代器失败返回空比如是否区分大小写。

match search findall finditer

</>复制代码

  1. re.match(pattern, string[, flags]):扫描字符串开头
    re.search(): 扫描整个字符串,返回第一个匹配成功的结果
    re.findall():返回所有结果的列表,失败返回空列表
    finditer() 返回迭代器 失败返回空

    flags 比如是否区分大小写。
    re.I:忽略大小写 ignorecase
    re.M:多行匹配 会影响$和^ multiline
    re.S:会匹配包括换行符在内的所有字符 # DOTALL dot matches all

</>复制代码

  1. import re
  2. tmp = "http"
  3. print(re.match(tmp,"http://www.baidu.com"))
  4. # <_sre.SRE_Match object; span=(0, 4), match="http">
  5. print(re.match(tmp,"://wwwhttp.baidu.com"))
  6. # None
  7. print(re.match(tmp,"http://www.baidu.com").span())
  8. # (0, 4)
  9. print(re.search(tmp, "www.Http://baidu.com", re.I))
  10. # <_sre.SRE_Match object; span=(4, 8), match="Http">
  11. print(re.findall(tmp, "http://www.http.com"))
  12. # ["http", "http"]
  13. find = re.finditer(tmp, "http://HTTp.com0", re.I)
  14. for i in find:
  15. print(i)
  16. # <_sre.SRE_Match object; span=(0, 4), match="http">
  17. # <_sre.SRE_Match object; span=(7, 11), match="HTTp">
各种匹配符号

· 匹配除换行符以外的所有字符

[] 是字符的集合,匹配括号中任意字符

[a-zA-Z] 大小写字符

[0-9]

[^0-9]除数字外的所有字符 ^托字符

d 匹配数字,效果等同于[0-9]

D 匹配除数字以外的字符 [^0-9]

w 匹配数字,字母及下划线 效果等同于[0-9a-zA-Z_]

W 取反

s 匹配任意空白字符(空格,换行,制表,换页,回车)[ntfr]

S 取反

</>复制代码

  1. print(re.findall(".","http:
  2. //"))
  3. # ["h", "t", "t", "p", ":", "/", "/"]
  4. print(re.findall("[12345]","qhchg461905nkj"))
  5. # ["4", "1", "5"]
  6. # 保留原始字符的R/r在正则中无效
  7. print(re.findall(r"D","123qwr"))
  8. # ["q", "w", "r"]
  9. print(re.findall("S","123 gh
  10. 78
  11. "))
  12. # ["1", "2", "3", "g", "h", "7", "8"]

^ 行首匹配(不在方括号内)

$ 行尾匹配(不在方括号内)当需要进行多行匹配时候,需要设置flags=re.M,如果不写默认匹配字符串的开头和结尾 只匹配一次

A 行首匹配 与^的区别:A只匹配整个字符串的开头,即使有flags = re.M参数也不会匹配其他的行首

Z 行尾匹配 与$的区别:Z只匹配整个字符串的结尾,即使有flags = re.M参数也不会匹配其他的行尾

b 匹配字符边界 就是字符串与空格间的位置,比如"ce",可以匹配nice 不能匹配nicer

B 匹配非字符边界

</>复制代码

  1. # 看你是否nice开始 类似于match
  2. print(re.findall("^nice","to nice meet you"))
  3. # []
  4. # 多行开头匹配
  5. print(re.findall("^nice","nice to meet you
  6. nice to meet you", re.M))
  7. # ["nice", "nice"]
  8. # 是否是com结尾
  9. print(re.findall("com$", "http:baidu.com"))
  10. # ["com"]
  11. #  本身是个转义字符,但在正则中也有特殊意义,在正则字符串前面加r
  12. # 将将转义字符的意义去掉 保留正则的意义
  13. # 以空格有边界的有一个ce
  14. print(re.findall(r"ce", "nice to meet niceto meet"))
  15. # ["ce"]

(abc) 匹配小括号中的字符作为整体

x? ? 匹配0或1个x字符 非贪婪匹配

x+ + 匹配至少一个x 贪婪匹配

x* * 匹配任意多个x 贪婪匹配

x{n} 匹配确定的n个x 非负整数

x{n,} 匹配大于等于n个x

x{n,m} 匹配至少n个x,最多m个

x|y 匹配x或y

</>复制代码

  1. print(re.findall("[abc]", "qwracb"))
  2. # ["a", "c", "b"]
  3. print(re.findall("(abc)", "qwrabc"))
  4. # ["abc"]
  5. print(re.findall("a?","a"))
  6. # ["a", ""]
  7. print(re.findall("(aa)?", "aaab"))
  8. # ["aa", "", "", ""]
  9. print(re.findall("(aa)","aaaab"))
  10. # ["aa", "aa"]
  11. print(re.findall("(aa)+","aaaab"))
  12. # 由于是贪婪匹配,相当于在最长的aaaa中找出: ["aa"]
  13. print(re.findall("aa+","aabaaaabaaaba"))
  14. # 最后一个a没 ["aa", "aaaa", "aaa"]
  15. print(re.findall("a*", "abaabbaaabaaaabb"))
  16. # 匹配任意多个a
  17. # ["a", "", "aa", "", "", "aaa", "", "aaaa", "", "", ""]
  18. print(re.findall("a{3}","aabaaacsdsaaa"))
  19. # ["aaa", "aaa"]
  20. print(re.findall("a{3,}","aabbaaabbaaaa"))
  21. # ["aaa", "aaaa"]
  22. print(re.findall("(good)","good--Good-good"))
  23. print(re.findall("good","good--Good-good"))
  24. # ["good", "good"]
  25. print(re.findall("(good)|(Good)","good--Good"))
  26. # [("good", ""), ("", "Good")]
  27. print(re.findall("good|Good","good--Good"))
  28. # ["good", "Good"]
特殊元字符

</>复制代码

  1. . 匹配除换行符以为的所有字符
    * 匹配任意多个 贪婪匹配
    ? 匹配0个或一个
    .*? 将贪婪匹配变为非贪婪

</>复制代码

  1. print(re.findall(".",""))
  2. # []
  3. print(re.findall(".*",""))
  4. # [""]
  5. r = "who .* he"
  6. print(re.findall(r, "who is a girl he who is boy he "))
  7. # ["who is a girl he who is boy he"] 贪婪
  8. r = "who .*? he"
  9. print(re.findall(r, "who is a girl he who is boy he who he"))
  10. # ["who is a girl he", "who is boy he", "who he"] 非贪婪
分组

</>复制代码

  1. 正则中有组的概念
    分组:group
    正则有判断是否匹配的功能,还提供了提取子串的功能,用()表示提取的分组,从外向里,从左向右标注第几组

</>复制代码

  1. tmp = "d{3}-d{8}"
  2. str1 = "010-12345678"
  3. result = re.findall(tmp, str1)
  4. print(result)
  5. # ["010-12345678"]
  6. tmp2 ="(d{3})-(d{8})" # 用小括号括起来的内容为一组
  7. result2 = re.findall(tmp2, str1)
  8. print(result2)
  9. # [("010", "12345678")]
  10. tmp3 = "(d{3})-(d{8})"
  11. result3 = re.match(tmp3, str1)
  12. print(result3)
  13. # <_sre.SRE_Match object; span=(0, 12), match="010-12345678">
  14. # groups()可以查看匹配到的所有分组的情况
  15. print(result3.groups()) # ("010", "12345678")
  16. # group() 可以多带带获取分组情况
  17. # group(0) 一直代表匹配到的原始字符串
  18. print(result3.group()) # 010-12345678
  19. print(result3.group(0)) # 010-12345678
  20. print(result3.group(1)) # 010
  21. print(result3.group(2)) # 12345678
  22. # 另起名称(?P<名称>)
  23. tmp4 = "(?Pd{3})-(?Pd{8})"
  24. result4 = re.match(tmp4, str1)
  25. print(result4.group(0))
  26. print(result4.group(1))
  27. print(result4.group(2))
  28. print(result4.group("love"))
正则与字符串

</>复制代码

  1. str1 = "ac b c d e"
  2. print(str1.split())
  3. # ["ac", "b", "c", "d", "e"]
  4. print(re.split(" +", str1))
  5. # ["ac", "b", "c", "d", "e"]
  6. # 替换字符串
  7. # re.sub(pattern, rep1, string)
  8. # pattern: 即将被替换的字符
  9. # rep1:替换的字符
  10. # count 替换次数
  11. # subn 将结果和替换的次数放到一个元组了
  12. res2 = re.sub(" +", "*", str1)
  13. print(res2)
  14. # ac*b*c*d*e
  15. res2 = re.sub(" +", "*", str1, count=2)
  16. print(res2)
  17. # ac*b*c d e
  18. res2 = re.subn(" +", "*", str1)
  19. print(res2)
  20. # ("ac*b*c*d*e", 4)
compile

</>复制代码

  1. tmp = "d{3}-d{8}"
  2. str1 = "090-99999999"
  3. res = re.match(tmp, str1)
  4. print(res)
  5. tmp2 = "d{3}-d{8}"
  6. str2 = "090-99999999"
  7. re_tmp2 = re.compile(tmp2)
  8. res2 = re_tmp2.match(str2)
  9. print(res2)
  10. # <_sre.SRE_Match object; span=(0, 12), match="090-99999999">
例子

</>复制代码

  1. # 判断某一个字符串是不是11位,第一个是否是数字1
  2. r= "^1d{10}$"
  3. # 1开头
  4. # 10个数字结尾
  5. print(re.findall(r, "12534568545"))
  6. # 前面是3个数字 后面八个数字 中间为-
  7. r= "^d{3}-d{8}$"
  8. # 123456@qq.com
  9. # ^.$ 在正则中有实际意义,如果想要作为普通字符使用需要使用转义字符
  10. r= "^d{6}@qq.com"
  11. print(re.findall(r,"125565@qq.com"))

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41644.html

相关文章

  • 正则达式

    摘要:本文内容共正则表达式火拼系列正则表达式回溯法原理学习正则表达式,是需要懂点儿匹配原理的。正则表达式迷你书问世了让帮你生成和解析参数字符串最全正则表达式总结验证号手机号中文邮编身份证地址等是正则表达式的缩写,作用是对字符串执行模式匹配。 JS 的正则表达式 正则表达式 一种几乎可以在所有的程序设计语言里和所有的计算机平台上使用的文字处理工具。它可以用来查找特定的信息(搜索),也可以用来查...

    bang590 评论0 收藏0
  • JS中的正则达式

    摘要:构造函数可以有两个字符串参数,第一个参数包含正则表达式的主体部分。只读的布尔值,说明这个正则表达式是否带有修饰符。中正则的扩展构造函数在中,只能接受字符串作为参数,允许其直接接受正则表达式作为参数。 上文传送门:初探正则表达式 正则表达式是一个描述字符模式的对象,JavaScript 的 RegExp 类表示正则表达式,String 和 RegExp 都定义了方法,后者使用正则表达式进...

    Soarkey 评论0 收藏0
  • JavaScript正则达式总结

    摘要:正则表达式一直是里比较难以掌握的点。在中创建正则的两种方式使用字面量这就是正则表达式的字面量语法,表示正则表达式的模式,为正则表达式的标志。字面量形式的正则表达式一般使用较多,也推荐大家尽可能使用这种形式,简洁易读,符合正常的使用习惯。 正则表达式一直是js里比较难以掌握的点。 看不懂,学不会,记不住。 每次需要用到正则的时候,都需要再去查找资料。 今天花时间把正则的知识点总结下,希望...

    big_cat 评论0 收藏0
  • 正则与JS中的正则

    摘要:注意本文将正则与中的正则分开讨论。正则零宽断言更多参考各种语言对于正则不同支持参考单行模式与多行模式通过设置正则表达式后的修饰符可开启对应的匹配模式单行模式和多行模式。 最近这段时间帮同学处理一些文档, 涉及到一些结构化文档的工作大部分都得使用正则表达式, 之前对于正则的认识大多来源于语言书上那几页的介绍, 自己也没有用过几次。这里将我之前感到模糊的概念作个整理。因为对JS了解多点,所...

    firim 评论0 收藏0
  • JavaScript正则达式的匹配模式

    摘要:选择分组和引用正则表达式的语法还包括指定选择项子表达式分组和引用前一子表达式的特殊字符。带圆括号的表达式的另一个用途是允许在同一正则表达式的后部引用前面的子表达式。 正则表达式(regular expression)是一个描述字符模式的对象。JavaScript的 RegExp类 表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进 行强大的模式匹配和文本检索与...

    wqj97 评论0 收藏0
  • 正则达式

    摘要:最全正则表达式总结验证号手机号中文邮编身份证地址等是正则表达式的缩写,作用是对字符串执行模式匹配。学习目标了解正则表达式语法在中使用正则表达式在中使 JS高级技巧 本篇是看的《JS高级程序设计》第23章《高级技巧》做的读书分享。本篇按照书里的思路根据自己的理解和经验,进行扩展延伸,同时指出书里的一些问题。将会讨论安全的类型检测、惰性载入函数、冻结对象、定时器等话题。1. 安全的类型检测...

    yibinnn 评论0 收藏0

发表评论

0条评论

whlong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<