正确的表白方式(正则表达式)

在学习知识之前,我们先来了解下最近的IT实况吧。最近大数据、人工智能炒的很火,不过AI是确确实实的要来了,自从AlphaGo Master战胜世界冠军柯洁,到AlphaGo Zero以100:0的战绩击败了AlphoGo后,AI就真的出现在了我们的视野里。2017年11月16日,世界百度大会在北京举行,人们问他最多的问题是:你坐无人车上五环有没有吃到罚单?李彦宏却答道:“确实收到了一张罚单,2018年量产无人驾驶汽车!”对于无人驾驶,基本共识是2020年可以实现无人驾驶车的量产,但作为创新者,百度不甘心,并希望在2018年7月实现无人驾驶小巴车的小规模量产及运营。之后又有Atlas人形机器人学会后空翻,人工智能的算法已经越来越先进,恐怕过不了多久,我们可能就会失业,一大批机器人就会出现在人类的视野里,但是,人类不必恐慌,因为强人工智能时代的到来还需要很长一段时间。

最近python语言比较火,这都跟机器学习以及AI脱不了干系,小编也自学了一点python,感叹于python的简便,但相对于C和java来说,运行速度就慢了许多,最近对爬虫比较感兴趣,所以就看了看正则表达式,虽然这仅仅是个小的知识点,但我还是对它的繁琐感到惊讶。

一、正则表达式概述

正则表达式,相信好多程序员对这个也不是很熟悉,因为它的语法比较繁琐。正则表达式是一种强大而灵活的文本处理工具,使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的紫福春进行搜索,一旦找到了匹配这些模式的部分,你就能随心所欲地对它们进行处理,如:字符串的匹配、选择、编辑以及验证。

一般来说,正则表达式就是以某种方式来描述字符串,因此你可以说:“如果一个字符串含有这些东西,那么它就是我正在找的东西。”例如:一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串。.(点号)也是一个正则表达式,它匹配任何一个字符如:"a" 或 "1"。故想要学会正则表达式,我们必须了解它的基本语法



这些只是一些主要的正则表达式特殊字符,因为正则表达式特殊字符比较多,在这里就不再赘述。

在java中,要插入一个正则表达式的反斜线,必须要用“\\”,这与其他语言不同,python只需要使用一个反斜线就可以了,并且在前面加上r表示原生字符串即可。

语法匹配实例:

1、java中 :   (-|\\+)?            这个正字表达式表示字符串的起始字符可能是一个-或+,或二者都没有(后面跟着?修饰符)。因为字符+表达式中有特殊的意义,所以必须使用\\将其转义,使之成为表达式中的一个普通字符。

2、python中:   [\(]?\d{3}[\)-]?\d{8}|[\(]?\d{4}[\)-]?\d{7}

该表达式匹配区号为3位的8位数电话号码或区号为4为的7位数电话号码。区号和本地号码之间采用“-”或者在区号两侧加圆括号分割。“[\)-]”表示最多只能取“)”或“-”其中之一,例如可匹配到:010-12345678、01012345678、(010)12345678。由于“(”和“)”是正则表达式中特殊的字符,如果要把它们作为普通字符来处理,需要在前面添加转义字符“\”。

二、创建正则表达式

1、包类介绍

要构造功能强大的正则表达式对象,需要导入java.util.regex包。

  • Pattern 类:

    pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

  • Matcher 类:

    Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

  • PatternSyntaxException:

    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

2、如何创建?

(1)用static Pattern.compile()方法编译正则表达式,生成一个Pattern对象。

(2)把想要检索的字符串传入Pattern对象的matcher()方法,matcher()方法会生成一个Matcher对象。

(3)可使用Matcher对象的许多方法。(读者请参考API查看方法)

a.  matches()方法对整个字符串进行匹配,只有整个字符串都匹配了才返回true。

b.  lookingAt()方法对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true。

c.  find()方法对字符串进行匹配,匹配到的字符串可以在任何位置。

Pattern与Matcher合作匹配正则表达式实例:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class Test {

public static void main(String[] args) {

Pattern p = Pattern.compile("\\d+");

Matcher m1 = p.matcher("22gf66");

Matcher m2 = p.matcher("456423");

System.out.println(m1.matches());

System.out.println(m2.matches());

}

}

执行结果第一个返回false,第二个返回true。第二个与下面这段代码等价

boolean a = Pattern.matches("\\d+", "456423");

System.out.println(a);

又与下面这段代码等价

boolean a = Pattern.compile("\\d+").matcher("456423").matches();

System.out.println(a);

3、python中的正则表达式

学习了java中的正则表达式之后呢,学python的也简单很多了。python提供了re模块进行正则表达式的匹配功能,re模块中有许多函数进行字符串的查找,替换,分隔的操作。下面简单介绍几个常用函数吧。

findall(pattern,string,flags=0) 根据pattern在string中匹配字符串,匹配成功,返回匹配结果的列表,否则返回空列表,flags表示规则选项(初学者在此可忽略flags的一些特殊规则)。

match(pattern,string,flags=0)根据pattern从string的头部开始匹配字符串,只返回第一次匹配成功的对象,否则返回None。

compile(pattern,flags=0)编译正则表达式pattern,返回一个Pattern对象。

方法使用示例

import re

s = "hello world"

print(re.findall(r"\w+",s))

tell = "0791-1234567"

print(re.findall(r"\d{3}-\d{8}|\d{4}-\d{7}", tell))

s = "1afsd23gg88"

p = re.compile(r"\d+")  #compile预编译返回一个pattern对象

print(p.findall(s))

第一个输出结果为['hello', 'world'],此处r表示后面的字符串为原生字符串,即不转义,使用真实字符。

第二个输出结果为['0791-1234567'],匹配成功。

第三个输出结果为['1', '23', '88']。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值