第一部分的课程主要集中在数据清理,清理的过程中遇到字符串的话,不可避免的要用到正则表达式。掌握好正则表达式是数据处理大有裨益,可以说是必不可少。 这是一个在线测试网站: https://regexr.com/
参考用cheatsheet regular exp
1. 匹配单个字符
.
表示任意字符。\.
斜杠是转义字符,这里表示就是要匹配.
符号。- 如果需要搜索
\
,则用\\
,前者用来转义,后者用来表示要搜索的字符。 - 下面是一组示例:
2. 匹配一组字符
[A-Za-z0-9]
的字符集合,A到Z的所有字母,a到z的所有字母,0-9 的所有数字。- 如下的①②③,分别表示字符集合/数字集合/数字集合的取反。
- ①:字母是n或s、紧接着a、后面是任意字母、然后是实际的.点号、最后xls
- ②:a的后面是1-9之间的数字,也可以写成[123456789]
- ③:^取反,除了1-9以外都OK
3. 使用元字符
- 元字符,是正则表达式中有特殊含义的字符,例如前面的
.
表示一个任意字符,[ ]
也是元字符,用来表示字符集合。 - 上面的例子: Pattern:
\[[0-9]\]
前后两个[
和]
分别被转义,用来表示这两个字符,可以匹配出if (myArray[0] == 0){
中的[0]
. \
本身也是元字符,所以在实际匹配\
的时候,要转义\\
,例如用\\
匹配得到\home\ben\sales\
。- 元字符大概分为两种,1种是用来匹配文本的,如
.
点号;另1种是正则表达式语法要求的,比如[
和]
,还有一种用来匹配空白字符的元字符。
- 匹配特定的字符类别 比如 [ns]a\d匹配了 na1 ,na2,sa1等。
4. 重复匹配
4.1 +
1个以上字符,*
0个或多个字符,?
0个或1个字符
- 通过
\w+@\w+\.\w+
,可以匹配出下面的三个邮件地址。
Send personal email to ben@forta.com. For questions about a book use
support@forta.com email to spam@forta.com
-
但如果添加一个邮件地址
abc.ben@forta.com
,就无法匹配了,因为\w
无法匹配 dot.
点号,需要修改为[\w.]+@\w+\.\w+
,将.
加入[ ]
集合中。 -
上面的
.
在[]
中不需要转义,转义也OK,与[\w\.]
效果相同。 -
Hello .ben@forta.com is my email address.
, 在ben的前面有个笔误.
号。通过[\w.]+@[\w.]+\.\w+
的话,就会将前面的dot 也匹配进来,email地址第一个字符不能为.
号,要修改为\w+[\w.]*@[\w.]+\.\w+
,限定第一个字符只能为 字母数字下划线。 -
https?:\/\/[\w./]+
,通过?
表示 s 可能有1个也可能没有,为了清晰表示,可以[s]?
The URL is http://www.forta.com,to connect ,securely use https://www.forta.com/ instead.
4.2 重复次数
上面的元字符,都没有字数限制,设定重复次数,用 { }
完成。
通过#[0-9A-F]{6}
可以匹配出颜色值#336633
和#FFFFFF
。
<BODY BGCOLOR="#336633" TEXT="#FFFFFF"
MARGINWINDTH="0" MARGINHEIGHT="0">
{2,4}
指2次到4次,如\d{2,4}
- 重复的次数可以为0,
{0,1}
与 ? 等价,都是0或1次 {3,}
指重复3次以及以上,例如,多于100美元的被过滤出来了 ,\d+:\$\d{3,}\.\d{2}
4.3 防止过度匹配
5. 位置匹配
5.1 边界
The cat scattered his food all over the room
cat
匹配的话,会匹配出cat
和scattered
两个。\bcat
的话,只会匹配出cat
,\b
匹配出来的是一个位置,这个位置位于 构成单词的字符 和 不能构成单词的字符之间。显然scattered
不符合要求。\b
只匹配一个位置,不匹配任何字符。- 如果想不匹配单词边界,用
\B
, 如果Pattern为\Bcat
的话,匹配出来的是scattered
中的cat
。
5.2 字符串边界
This is to bad
<?xml version="1.0" encoding="UTF-8" ?>
…
xmlns:apachesoap="http://xml.apache.org/xml-soap"
- 上面不是正确的xml文件,因为第一行 是不是xml格式。如果用
<\?xml.*\?>
去判断该文件是否xml的话,会得到匹配结果,显然是不正确的 - 需要限定能匹配这个pattern的只能是第一行用
^\s*<\?xml.*\?>
匹配的话,就能正确判断该文件不符合xml格式。 ^\s*
,^
限定了第一行,\s*
排除了空白行。$
用来表示末尾,用法完全一样,比如判断html文件的结尾是不是</html> ,<\/[Hh][Tt][Mm][Ll]>\s*$
, \用来转义,\s* 用来排除空白字符,$表示字符串末尾
<html>
<body>
</body>
</html>