Regular Expression 正则表达式学习
Resources
Rules
Re规则和find -name的显著区别有: 对于名字比待匹配字数多出来的不用加*
元字符
- 对特殊字符,用
\
转义- 当然放到
[]
里面好像也可以其效果
- 当然放到
- 锚点(Anchor)
^
从开始开始匹配$
从末尾开始匹配- 这种规则是只能匹配开头第一个字母或者是末尾的字母
- 比如
r'the$'
就匹配不出来,因为the不在最后
- 基础匹配
.
任意单个字符[$CHAR_TO_INCLUDE]
中括号内部的字符可以匹配- 其实或运算符和这个效果类似?
|
- 其实或运算符和这个效果类似?
[^($CHAR_TO_EXCLUDE)]
中括号内部的字符不出现
- 重复的次数
*
之前的字符出现0或者更多次- 匹配
at
其中t有一个或者更多,所以att可以被匹配
- 匹配
+
前面的字符>0个的字符?
表示前面的字符出现0或者是1次-
- 所以
a
也可以被匹配
- 所以
-
- 直接的
at
相当于每个字符都是限定出现一次 - 而
{}
可以直接表示有多少个- 单纯的
{}
表示对某个字符出现可以出现多次,加上()
就是可以对多个字符出现多次
- 单纯的
CHARS | Usage |
---|---|
. [] ^ $ | 用作匹配 |
* + ? {} | 在匹配后面表示上一个匹配的次数 |
- 简写字符
-
记录一下经常用到的
\w 所有字母和数字 \W 所有非字母的数字 \d 所有数字 \s 所有空格
-
- ~~ 修饰符号 ~~
i
(使用的时候必须转义) 忽略大小写- (在Python demo里没有搞定,可能不支持?)
- 贪婪以及惰性匹配 - ?
- 默认是贪婪匹配,会包括尽量多的元素
- 可以通过(),改为惰性匹配
在命令行当中,默认的grep以及egrep都是不支持的,需要用perl的grep - grep -P
注意一下grep的惰性匹配是从前往后的
正确的办法
journalctl -q | grep -P "\ \w+ms"
journalctl -q | grep -P "\ [^ ]*ms"
- Groups
如果我想要类似scanf的功能怎么办?
- 用
<?P<group_name>>
去匹配- 圆括号内是需要匹配的内容,如果有限制可以加在尖括号后面,比如
[1,2,3]啊或者是+啊之类的
- 对于re.search来说,搜索出来的结果会直接在 re.find(r’‘,s0).groups(“$GROUP+NAME”)当中
- 例子
- 圆括号内是需要匹配的内容,如果有限制可以加在尖括号后面,比如
- 如果当前正则就需要用到匹配出来的这个group,在之后用
(?P=$GROUP_NAME)
来调用- Example
- 上面的例子,匹配两个引号之间的Vincent作为name,后面接一个任意字符,再后面接这个name的Pattern才会被匹配
- 如果需要在re.sub中调用name,则需要写
"\g<name>"
Example
r'[[](.*?)[]]'
, 匹配[]
中的0个或者更多个,且之前的[
只能出现0或1个(来避免直接索引到跨多个括号情况)(.*?)
表示两个括号内的内容,.
表示是任意字符,*?
比较特别,有一个”as few as possible”的意思,叫做Lazy Quantifier-
- 0个或者是1个”[“,搭配上固定的一个”]”
Application
- Python OS 库
- BASH指令 grep -E
ll | grep -E py$
Python Re
params = re.findall(r'[[](.*?)[]]', $STRING)
返回一个list,匹配正则内部的内容- 寻找多个
- 直接返回一个list
re.match(r'', $STRING)
&re.search(r'', $STRING)
- 内容现在作为一个list在返回值的
return_value.group()
- match默认从开头开始索引,而search不是,但是两者都会找到第一个,然后就返回
- 内容现在作为一个list在返回值的
pattern = re.compile(r' ')
可以将某个正则表达式编译为一个规则(但是我们通常可以不这么做)
pattern = re.compile(r'[t|T]he')
result = pattern.match(string)
print(result.group())
result = re.sub(r'',"$STRING_TO_REPLACE, %STRING)
替换