正则表达式
一、元字符
元字符:即为有特定含义的字符,常见的元字符如下
代码 | 说明 |
---|---|
| | 选择,例如:a|b表示a或b |
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始(在集合字符里[^a]表示非(不匹配)的意思 |
$ | 匹配字符串的结束 |
二、反义字符
反义字符:多用于查找除某个字符以外其他任意字符均可以的情况
常用的反义字符如下:
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
三、限定字符
限定字符多用于重复匹配次数
常用的限定字符如下
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
重复n次 | |
重复n次或更多次 | |
重复n到m次 |
四、优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符 | 描述 |
---|---|
\ | 转义符 |
(), (? : ), (?=),[] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, | 限定符 |
^, $, \任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 替换,"或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。 |
四、子组结构
代码 | 说明 |
---|---|
(...) | 匹配并捕获括号内容 |
(?: ...) | 匹配不捕获括号内容 |
(?'name'...)或(? |
命名捕获组 |
(?(1)yes|no) | 条件语句 |
五、修饰符
下表列出了正则表达式常用的修饰符:
修饰符 | 含义 | 描述 |
---|---|---|
i | ignore - 不区分大小写 | 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。 |
g | global - 全局匹配 | 查找所有的匹配项。 |
m | multi line - 多行匹配 | 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。 |
s | 特殊字符圆点 . 中包含换行符 \n | 默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。 |
案例 :
^(?P<userid>\d+)访问了(?P<tag>\d+)类别的(?P<newid>\d+)新闻$
>测试文本
17访问了2516类别的31417新闻
17访问了2516类别的31418新闻
17访问了2516类别的31419新闻
17访问了2516类别的31420新闻
17访问了31417新闻
17访问了31417新闻
17访问了31417新闻
附录:正则表达式提取值的一些问题处理
1、通常情况就是单规则直接提取
给定字符串:gold,100000,1000,-1;addUp,71,599,-1;addUp,72,1000,-1;addUp,73,1065,-1;addUp,74,1002,-1;addUp,75,999,-1
单规则提取
2、多规则提取匹配多的值
个人采用如下代码实现:
pattern_list=[r"^(?P<userid>.*)访问了(?P<tag>.*)类别的(?P<newid>.*)新闻$",r"^(?P<userid>.*)收藏了(?P<newid>.*)新闻$",r"^(?P<userid>.*)收藏了(?P<newid>.*)新闻$"]
User_behavior=[UserRead,UserCollections,UserLikes]
for pattern,beheavior in zip(pattern_list,User_behavior):
user_action=logtables['message'].str.extract(pattern)
#user_action为列表类型
3、按照要求提取指定的字符串
以下列出 ?=、?<=、?!、?<! 的使用区别
exp1(?=exp2):查找 exp2 前面的 exp1。
(?<=exp2)exp1:查找 exp2 后面的 exp1。
exp1(?!exp2):查找后面不是 exp2 的 exp1。
(?<!exp2)exp1:查找前面不是 exp2 的 exp1。
学习正则关键: 多练,正则练习网站
参考文章 : (正则表达式提取值的一些问题处理_格林爱通话的CSDN博客
本文来自博客园,作者:KMP,转载请注明原文链接:https://www.cnblogs.com/touchTomorrow/p/16450212.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步