正则表达式的使用
对于NLP来说,正则表达式在模版比较固定的场景发挥着至关重要的作用,下面来介绍一下正则表达式的一些基本的使用,我们用python的re模块来实现我们的功能。
1、匹配单个字符
字符 | 功能 |
. | 匹配任意的一个字符(除了“\n”) |
[] | 匹配[]中列举的字符 |
\d | 匹配数字(0-9) |
\D | 匹配非数字 |
\s | 匹配空白(空格、tab键) |
\S | 匹配非空白字符 |
\w | 匹配单词字符 |
\W | 匹配非单词字符 |
Example:
import re input_str = "我叫小明,我喜欢NLP,学号是123" # 匹配任意一个字符 test01 = re.match(".", input_str) print(test01.group()) test02 = re.match("我.小明,我喜欢NLP", input_str) print(test02.group()) # 匹配列举的字符 test03 = re.match("[hH]", "haha") print(test03.group()) # 匹配开头为数字的字符串 test04 = re.match("[0-9]haha", "1haha") print(test04.group()) # 匹配0到2 、7到9的数字的字符串 test05 = re.match("[0-27-9]haha", "8haha") print(test05.group()) # 匹配有数字的字符串 test06 = re.match("天宫\d号", "天宫1号发射") print(test06.group()) """ 答案如下: 我 我叫小明,我喜欢NLP h 1haha 8haha 天宫1号 """
2、匹配多个字符
字符 | 功能 | 表达式实例 | 完整匹配的字符串 |
* | 匹配前一个字符出现0次或者无限次(可有可无) | abc* | abc、abcc |
+ | 匹配前一个字符出现1次(至少一次) | abcc | abcc、abccc |
? | 匹配前一个字符出现1次或者0次 | abc* | ab、abc |
{m} | 匹配前一个字符出现m次 | ab{2}c | abbc |
{m,n} | 匹配前一个字符出现m到n次,若省略m则从0次开始到m,若省略n,则是从m到无限次 | ab{,2}c | ac、abc、abbc |
Example:
test01 = re.match("[1-9]?[0-9]", "7") test02 = re.match("[1-9]?\d", "7790") # 匹配6位的密码 test03 = re.match("[a-zA-Z0-9_]{6}", "12345678") print(test01.group()) print(test02.group()) print(test03.group()) """ 7 77 123456 """
3、匹配开头和结尾
字符 | 功能 |
^ |
匹配字符串开头 |
$ | 匹配字符串结尾 |
Example:
# 匹配开头和结尾 # 以qq 邮箱地址为例子,只有第一个是符合的 email_list = ["haha@qq.com", ".ha@qq.com", "haha@qq..com", "哈哈@qq.com"] for email_i in email_list: ret = re.match("[\w]{4,20}@qq\.com$", email_i) if ret: print("符合") else: print("不符合")
4、匹配分组
字符 | 功能 |
| | 匹配左右任意一个表达式 |
(ab) | 将括号中的字符作为一个分组 |
\num | 引用分组num匹配到的字符串 |
(?P<name>) | 分组起别名,匹配到的子串组在外部是通过定义name来获取的 |
(?P=name) | 引用别名为name分组匹配到的字符串 |
Example:
# 匹配0-100之间的数字 test01 = re.match("[0-9]?\d|100", "9") print(test01.group()) # 匹配出163、qq、edu的邮箱 test02 = re.match("\w{4,20}@(163|qq|edu)\.com", "1230@edu.com") print(test02.group()) # 不是以4、7结尾的手机号码(4位) test03 = re.match("1\d{2}[0-35-68-9]", "1001") print(test03.group()) """ 9 1230@edu.com 1001 """