本文档主要介绍正则表达式的匹配方式以及特殊字符的转义处理。
完全匹配
正则表达式的值与字符串完全一致,则是完全匹配。例如1234
完全匹配\d+
,但是abc123
与\d+
则不是完全匹配。
有些函数是部分匹配,您可以在开头与结尾添加^
与$
将部分匹配的场景变成完全匹配。例如正则表达式^正则$
。更多正则表达式语法请参见正则表达式操作。
不同函数的匹配模式如表格所示。
分类 | 函数 | 匹配模式 |
---|---|---|
全局操作函数 | e_regex | 部分匹配 |
e_keep_fields | 完全匹配 | |
e_drop_fields | 完全匹配 | |
e_rename | 完全匹配 | |
e_kv | 部分匹配 | |
e_search_dict_map | 部分匹配 | |
e_search_table_map | 部分匹配 | |
表达式函数 | e_match | 参数控制,默认为完全匹配。 |
e_search | 部分匹配 | |
regex_select | 部分匹配 | |
regex_findall | 部分匹配 | |
regex_match | 参数控制,默认为部分匹配。 | |
regex_replace | 部分匹配 | |
regex_split | 部分匹配 |
匹配模式示例。
reg_match("abc123", r"\d+")
:匹配。默认为部分匹配模式。reg_match("abc123", r"\d+", full=True)
:不匹配。设置了完全匹配模式。reg_match("abc123", r"^\d+$")
:不匹配 。等效完全匹配模式。e_search(r'status~="\d+"')
:根据status
字段的值匹配。与部分匹配模式等效。e_search(r'status~="^\d+$"')
:根据status
字段的值匹配。与完全匹配模式等效。
字符转义
正则表达式中可能会包含特殊字符,如果需要获取这些字符本身的含义,就需要进行转义。
- 通过
\
进行转义,请参见字符转义。 - 通过
str_regex_escape
函数进行转义。例如
e_drop_fields(str_regex_escape("abc.test"))
,表示丢弃字段abc.test
。而e_drop_fields("abc.test")
则表示丢弃符合abc?test
的字段,?
表示任意字符。
分组
分组就是将需要重复的表达式用小括号
()
括起来,然后对这个表达式进行重复引用。以下示例为分组和不分区的区别:
"""
处理前日志为:
SourceIP: 1.1.1.1
处理后日志为:
SourceIP: 1.1.1.1
ip: 1.1.1.1
"""
# 不分组:
e_regex("SourceIP",r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}","ip")
# 分组:
e_regex("SourceIP", "\d{1,3}(.\d{1,3}){3}", "ip")
捕获组
捕获组会将捕获到的文本内容缓存在内存中,可以通过反向引用在其他表达式中使用。形式上捕获组的小括号中不是以?:
开头。
默认情况下,每个捕获组会自动拥有一个编号。从左向右,以分组的左括号为标志,第一个出现的分组的编号为1,第二个为2,以此类推。例如:
(\d{4})-(\d{2}-(\d{2}))
1 1 2 3 32
如果正则表达式中同时存在普通分组和命名分组,那么分组的编号规则是先对普通捕获组进行编号,再对命名捕获组进行编号。
支持在表达式或程序中直接引用自定义的捕获组组名。
非捕获组
非捕获组不会将匹配到的文本内容缓存到内存中,形式上非捕获组的小括号中以?:
开头。
例如我们要查找
program
和project
,正则表达式可以表示为pro(gram|ject)
,如果我们不希望将表达式匹配的内容缓存到内存中,此时我们可以用pro(?:gram|ject)
进行非捕获匹配,这样既可以简洁匹配又可以节省内存。
说明
(?:x)
表示匹配x
但是不缓存匹配项,可以定义与正则表达式运算符一起使用的子表达式。
在文档使用中是否遇到以下问题
更多建议
匿名提交