正则表达式
1. 什么是正则表达式
在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需求。正则表达式就是用于描述这些规则的工具。
你可能使用过Windows下用于文件查找的通配符,也就是*
和?
。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc
。在这里,*
会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求。
假设你在一篇英文小说里查找hi,你可以使用正则表达式hi
。
这几乎是最简单的正则表达式了,它可以精确匹配字符串hi。
不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b
。
\b
是正则表达式的一个元字符,代表着单词的开头或结尾,也就是单词的分界处。
如果同时使用其它元字符,就能构造出功能更强大的正则表达式。比如下面这个例子:
0\d\d-\d\d\d\d\d\d\d\d
匹配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字。
这里的\d是个新的元字符,匹配一位数字(0...9)。-不是元字符,只匹配它本身。
为了避免重复,也可以这样写这个表达式:0\d{2}-\d{8}
。这里\d后面的{2}({8})的意思是前面\d必须连续重复匹配2次(8次)。
2. 常用元字符
正则表达式常用的元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
正则表达式常用的限定符
语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
下面来看看更多的例子:
\ba\w*\b
匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)。
\b\w{6}\b
匹配刚好6个字符的单词。
关于正则表达式更多信息,可以参考http://deerchao.net/tutorials/regex/regex.htm
3. JDA正则表达式匹配和替换
3.1. 函数rpa_regMatchAll匹配字符串的所有项:
result = rpa_regMatchAll(r'\d+', 'jingdong 123 google 456')
第一个参数是正则表达式,第二个参数是要匹配的字符串,返回匹配的所有字符串列表。在这个例子中返回['123', '456']
。
3.2. 函数rpa_regMatchFirst匹配字符串的第一项:
result = rpa_regMatchFirst(r'\d+', 'jingdong 123 google 456')
第一个参数是正则表达式,第二个参数是要匹配的字符串,返回匹配的第一个字符串。在这个例子中返回123
。
3.3. 函数rpa_regSub可以执行正则表达式替换:
phone = "2004-959-559 # 这是一个电话号码"
num = rpa_regSub(r'\d', "x", phone)
print(num)
第一个参数是正则表达式,第二个参数是用来替换的字符串,第三个参数要被替换的原始字符串,第四个参数是可选参数,表示是否只替换第一项(默认为false,全部替换)。返回替换完成后的字符串。在这个例子中返回xxxx-xxx-xxx # 这是一个电话号码
。