正则表达式基础
2018-07-05 本文已影响0人
刘家成
前言
正则表达式在各个领域都有涉及,用起来也比较简单,常用的还是有必要记住的,否则对接触新知识会有些屏障。本文内容掌握后,可以处理常用的正则匹配。本文以Python里re包来介绍,若运行下方实例需要导入re包。
字符 | 描述 |
---|---|
\n | 换行符 |
\w | 字母、数字、下划线 |
\W | 除字母、数字、下划线 |
\d | 十进制整数 |
\D | 除十进制整数 |
\s | 空字符 |
\D | 除空字符 |
针对上方表格内容,下面将通过示例进行讲解:
string = '''adsfasfa d
0989djkh
as'''
str = re.compile('\n').findall(string)
print(str)
str = re.compile('\w').findall(string)
print(str)
str = re.compile('\W').findall(string)
print(str)
str = re.compile('\d').findall(string)
print(str)
str = re.compile('\D').findall(string)
print(str)
str = re.compile('\s').findall(string)
print(str)
str = re.compile('\S').findall(string)
print(str)
输出结果:
['\n', '\n']
['a', 'd', 's', 'f', 'a', 's', 'f', 'a', 'd', '0', '9', '8', '9', 'd', 'j', 'k', 'h', 'a', 's']
[' ', '\n', '\n']
['0', '9', '8', '9']
['a', 'd', 's', 'f', 'a', 's', 'f', 'a', ' ', 'd', '\n', 'd', 'j', 'k', 'h', '\n', 'a', 's']
[' ', '\n', '\n']
['a', 'd', 's', 'f', 'a', 's', 'f', 'a', 'd', '0', '9', '8', '9', 'd', 'j', 'k', 'h', 'a', 's']
以上为Python语法,变量可以重复赋值,不会报错。这里都是简单的正则,建议必须背下来,上方表格内容都是匹配的单个字符进行而不是多个字符,单个满足的字符都会打印出来。
字符 | 描述 |
---|---|
. | 除换行外任意一个字符 |
^ | 开始位置 |
$ | 结束位置 |
* | 前一个字符出现0\1\多次 |
? | 前一个字符出现0\1次 |
+ | 前一个字符出现1\多次 |
{n} | 前一个字符恰好出现n次 |
{n,} | 前一个字符至少n次 |
{n,m} | 前一个字符至少n,至多m次 |
| | 选择符 或 |
() | 想提取出什么内容,就在正则中用小括号将其括起来 |
针对上方表格内容,下面将通过示例进行讲解:
string = '''afdaafdd2dadaafadadsf222222333
edu'''
str = re.compile('(\w\d\w\d\d\w)').findall(string)
print(str)
str = re.compile('.').findall(string)
print(str)
str = re.compile('da+').findall(string)
print(str)
str = re.compile('da*').findall(string)
print(str)
str = re.compile('da{1}').findall(string)
print(str)
str = re.compile('da{2}').findall(string)
print(str)
str = re.compile('da|fada').findall(string)
print(str)
str = re.compile("^af(d..).").findall(string)
print(str)
str = re.compile("^afda(a.2..).").findall(string)
print(str)
str = re.compile("(d.).").findall(string)
print(str)
str = re.compile("[^a]").findall(string)
print(str)
string = "phytphonyhjskjsa"
str = re.compile("p.*?y").findall(string)
print(str)
str = re.compile("p.*y").findall(string)
print(str)
str = re.compile("p.+?y").findall(string)
print(str)
输出结果:
['f22222']
['a', 'f', 'd', 'a', 'a', 'f', 'd', 'd', '2', 'd', 'a', 'd', 'a', 'a', 'f', 'a', 'd', 'a', 'd', 's', 'f', '2', '2', '2', '2', '2', '2', '3', '3', '3', 'e', 'd', 'u']
['daa', 'da', 'daa', 'da']
['daa', 'd', 'd', 'da', 'daa', 'da', 'd', 'd']
['da', 'da', 'da', 'da']
['daa', 'daa']
['da', 'da', 'da', 'fada']
['daa']
[]
['da', 'dd', 'da', 'da']
['f', 'd', 'f', 'd', 'd', '2', 'd', 'd', 'f', 'd', 'd', 's', 'f', '2', '2', '2', '2', '2', '2', '3', '3', '3', '\n', 'e', 'd', 'u']
['phy', 'phony']
['phytphony']
['phy', 'phony']
- 凡是使用“()”,匹配的内容都是括号里面的,和括号前后字符都没有关系,例如"(d.)." 只会匹配出来长度为2的字符串。
- 正则默认为贪婪模式,如需精准匹配,需要特殊处理。其中“*?”会匹配出尽量多的字符。
- 如需精准匹配,可在compile方法后面多加一个参数,re.S 。
- 正则是区分大小写,如需不区分大小写,可以加一个参数:re.I,这样就可以正确匹配。