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才会被匹配
- Example
- 如果需要在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)替换













