正则表达式入门(java,python版本)
2017-03-30 20:53
507 查看
目录
本文目标正则表达式到底是什么
正则表达式可以用来做什么
基本语法
元字符
实例
本文目标
快速让你知道真这个表达式是什么,对正则表达式的概念有基本的了解,并且能够在不同的编程语言中使用它。
正则表达式到底是什么
正则表达式,(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。注意上文加粗的‘概念’,即用英文来说,叫做concept。显然,正则表达式是跟编程语言无关的,因此,我们可以使用任何编程语言去实现和使用它。幸运的是,绝大多数编程语言都已经实现了正则表达式,并且提供了相应的类或者API接口,我们可以在程序中直接使用它,而无需去考虑底层是如何实现的。
正则表达式可以用来做什么
1 验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。2 用来查找字符串,从一个长的文本中查找符合指定特征的字符串
3 用来替换,比普通的替换更强大
4 等等…
基本语法
一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列匹配某个句法规则的字符串。 语法很简单,就是一个“字符串”。 例如: "hello Regular Expression" 这个字符串: 我们可以用下面语法来筛选出来: 1"hello Regular Expression" 2 "hello*" 3 "hello.+" 4 "hello .+n" ... 这些**描述**筛选出来,这里我们可以先不用管里面的"*",".","+"是什么意思,我们只需知道这个可以作为一个正则表达式的表示形式(基本语法)。
元字符
上面的".","*","+"等字符都是正则表达式中的元字符,关于元字符的讲述,可以再新开一篇文章来讲解,这里提供一个正则表达式元字符含义的讲解链接,**请认真浏览完此页面再查看本文章的后面的内容。** 为了避免转载侵权和防止和谐,这里提供百度的地址:
正则表达式元字符说明
字符转义:
这里仍然有一个问题:如果我们需要匹配元字符本身,该如何处理? 那么就需要用到字符转义符号:'\'。 例如,如果我们需要从"test * test"匹配出 "*"这个符号, 那么正则表达式就要写成: "\*",而不是"*", 值得注意的是转义字符本身: 如果我们需要从"test \ test"匹配出 "\"这个符号, 那么正则表达式就要写成: "\\\\",而不是"\\"。
实例
上面看了这么多,接下来我们来看看具体的应用实例吧,以加深我们的印象。 下面的例子只提供了Python和Java版本,其它语言类似,可自行参考相应语言的API文档。
匹配出网页中的title标签和其中的内容
python 代码:
#!/usr/bin/python # coding=utf-8 import re reg_str = """ <!DOCTYPE html> <html> <head> <title>我是title</title> </head> <body> </body> </html> """ reg1 = u"<title>.+</title>" reg2 = u"<title>.*</title>" rst1 = re.search(reg1, reg_str) rst2 = re.search(reg2, reg_str) print rst1 and rst1.group() print rst2 and rst2.group()
结果:
我是title
我是title
[Finished in 0.0s]
java 代码:
package regular_expression; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Chapter1 { public static void main(String []args) { String reg_str = "<!DOCTYPE html><html><head> <title>我是title</title></head><body></body></html>"; String reg1 = "<title>.+</title>"; String reg2 = "<title>.*</title>"; Pattern p1=Pattern.compile(reg1); Matcher m1=p1.matcher(reg_str); Pattern p2=Pattern.compile(reg2); Matcher m2=p2.matcher(reg_str); if (m1.find()) { System.out.println(m1.group()); } if (m2.find()) { System.out.println(m2.group()); } } }
结果:
<title>我是title</title> <title>我是title</title>
结果解释:
"<title>.+</title>" # . 是正则表达式里面的元字符,查看元字符的文档可知,.表示 “匹配除换行符以外的任意字符”,因此他会匹配出 # <title>和</title>之间的任何非换行符。 # +也是正则表达式中的元字符,+表示匹配一次或者多次(即至少匹配一次,同{1,}) # 因此这个正则最终的意思就是 匹配<title>和</title>之间的任何非换行符,并且至少匹配一次 # 同理 *表示0次或多次,即匹配<title>和</title>之间的任何非换行符,并且至少匹配0次。 两个的差别就是: +不能匹配出 “<title></title>”字符串 *可以匹配出 “<title></title>”字符串 因为<title>和</title>之间一个字符也没有,所以需要*才能匹配。
统计字符串中所有词的词性的个数
Python代码:
#!/usr/bin/python # coding=utf-8 import re reg_str = """ 词语1 \q 词语2 \w 词语3 \ee 词语1 \q 词语5 \w 词语6 \e 词语7 \c """ reg = u"\\\\[a-z]{1,2}" rst2 = re.finditer(reg, reg_str) # 词性个数 count_map = {} for m in rst2: value = m.group() if (count_map.get(value)): count_map[value] = count_map[value] + 1 else: count_map[value] = 1 for k,v in count_map.items(): print '词性{}的个数为{}'.format(k,v)
结果:
词性\c的个数为1
词性\w的个数为2
词性\e的个数为1
词性\ee的个数为1
词性\q的个数为2
[Finished in 0.0s]
java代码:
package regular_expression; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.HashMap; import java.util.Map.Entry; public class Chapter1 { public static void main(String []args) { String reg_str = "词语1 \\q词语2 \\w词语3 \\ee词语1 \\q词语5 \\w词语6 \\e词语7 \\c"; String reg ="\\\\[a-z]{1,2}"; Pattern p=Pattern.compile(reg); Matcher m=p.matcher(reg_str); // 词性个数 HashMap<String, Integer> count_map = new HashMap<String, Integer>(); String value = ""; while (m.find()) { value = m.group(); if (count_map.get(value) != null) { count_map.put(value, count_map.get(value) + 1); } else { count_map.put(value,1); } } for (Entry<String, Integer> entry: count_map.entrySet()){ System.out.println("词性"+entry.getKey()+"的个数为"+ Integer.toString(entry.getValue())); } } }
结果:
词性\q的个数为2
词性\c的个数为1
词性\e的个数为1
词性\w的个数为2
词性\ee的个数为1
结果解释:
“\\[a-z]{1,2} 表示匹配 ‘\’符号加上后面的任意1-2个英文小写字母。
即:\字母 表示词性的话,那么这个正则就已经把所有词的词性的个数都已经筛选出来。最后再经过词性的map操作,就把所有词性的个数计算出来了。
PS:至于为什么是\\\\,文章前面已经提到。
[b]参考链接:[/b]
1 https://zh.wikipedia.org/wiki/正则表达式
相关文章推荐
- 不通用版(从SVN取版本,通过MAVEN生成JAVA包,通过SALTSTACK传送到远程服务器并自动重启TOMCAT服务)PYTHON代码
- 中文维基百科上的word2vec实验,python及java版本
- simhash Java和Python版本的实现
- 中文维基百科上的word2vec实验,python及java版本
- 使用libsvm进行分类之python和java版本
- AES加解密多版本(GO、JAVA、Python)实现
- python --eclipse 配置(完成后找不到pydev ,因为java版本不对)
- python实现指定目录下JAVA文件单词计数的多进程版本
- 快速排序 python从java版本翻译过来:
- 网站访问机器人程序的java版本和C#版本。
- 农历与阳历转换java版本
- 探讨3d游戏的制作和我对quake2--java2版本的研究
- 小叮咚 中文分词 发布 java 版本 , c# 版本 , c++ 版本
- Python 不是 Java
- UML工具推荐 Poseidon版本 可以免费下载,自动生成代码 C++ Java C# VB.NET等 (来自德国汉堡的国际性建模软件开发商Gentleware AG的)
- [Java]Axis需要高版本的J2sdk: j2sdk-1_4_2_08
- Java Script 正则表达式入门(二)
- Java的版本问题
- 用Java比较JRE版本
- 趣谈Java版本名称