var = re.compile((pattern), flags=0)
: 一般用于同一个正则表达式被调用多次,后续可通过重复调用var.model(text)
进行字符串匹配,同re.model((pattern), text)
方法一样。
| 含义 |
---|---|
re.I | 不区分大小写 |
本部分内容提到的pattern
和text
默认情况下均代表re.model((pattern), text)
中意义。
(1)分组机制 (pattern)
这个外()
即为匹配后分组的第0个,接着才是()
内设置的下一级()
从左到右依次分组索引为为1、2、3、...、n,如果下一级()
中还有下下一级()
,则会从左到右先将最左边的()
中的所有下一级()
分配索引才会分配下一个()
如:
text = "abcaA_3287746823_sajkD"
outcome = re.match("([a-z]{4}([A-Z]))_\d+_([a-z]{4}([A-Z]))", text)
outcome[0], outcome[1], outcome[2], outcome[3], outcome[4],
-------------------------------------------------------------
abcaA_3287746823_sajkD
abcaA
A
sajkD
D
该部分例子结束
text = "GEDI02_A_2019121185513_O02173_02_T00604_02_003_01_V002"
print(re.match("2019", text))
-----
None
由于match方法是从头开始匹配的,因此匹配不到,返回为None.
text = "GEDI02_A_2019121185513_O02173_02_T00604_02_003_01_V002"
print(re.match("GEDI", text))
-----
<re.Match object; span=(0, 4), match='GEDI'>
这样就匹配到了,其返回的是一个re.Match对象,返回位置为字符串的0-4位置,可以通过索引取得该值。
text = "GEDI02_A_2019121185513_O02173_02_T00604_02_003_01_V002"
outcome = re.match("GEDI", text)
outcome[0]
-----
'GEDI'
注意:python中"\d"
等""+任意字符虽然不是"\n"
和"\t"
这种有明确意义的字符串,但是其在python中被解释效果为"\\d"
,因为python中"\"
字符就包含转义的意义,但是字符串"\d"
中的"\"
表示的只是单纯的一个反斜杠含义,因此python要表示这一含义的实际代码为"\\"
如:
a = "\\2"
print(re.match("\\\\\d", a))
-------
<re.Match object; span=(0, 2), match='\\2'>
即re.match(pattern, text)
中,pattern
中的字符串会先被re模块解释,解释后的字符串会再被python解释,而text
中的内容也会被python解释,等于匹配的是python解释的意义。
匹配字符 | 含义 |
---|---|
| 表示任意字符, |
| 表示任意0-9之间的数字, 包括 |
| 表示任意非0-9之间的字符, 包括 |
| 表示空格字符,包括 |
| 表示非空白符,与 |
| 大小写字母、数字和下划线 |
| 非字母、非数字和非下划线,与 |
| 换页符 |
| 换行符 |
| 回车符 |
| 制表符 |
| 垂直制表符 |
|
|
符号 | 含义 |
---|---|
| 表示匹配 |
| 表示匹配 |
| 表示匹配 |
| 表示匹配 |
| 用在 |
| 用在 |
| 转义字符,如要匹配 |
| 表示以 |
| 正先行断言,存在,表匹配后面紧跟着text2字符串的text1部分 |
| 负先行断言,存在,表匹配后面不紧跟着text2字符串的text1部分 |
| 正后发断言,存在,表匹配前面紧跟着text2字符串的text1部分 |
| 负后发断言,存在,表匹配前面不紧跟着text2字符串的text1部分 |
注意:?
如果匹配了0次,即?
前的字符在给定text
中没有,或者text
为空,也会输出,但是为''
,而不是None
。 {}
中不要添加空格
字符集类型 | 含义 | 示例(特殊用法) |
---|---|---|
| 匹配 | [a-c]a-c任意小写字母、[0-6]0-6任意数字、[A-C]A-C任意大写字母、[a-zA-Z]任意不区分大小写a-z字母、[^a-c]取反 |
单词 | 含义 |
---|---|
| 表示到 |
| 表示只匹配字符串 |
| 表示只匹配字符串 |
## 1.5. 别名 (?P<nick_name>)
:配合()
使用,()
内的?P<nick_name>
才是本体,其义为紧跟在?P<nick_name>
之后,直到()
结束的位置的匹配符号其名为nick_name
,以便后续需要重复匹配到相同字符串时直接调用该nick_name
即可。 如:
text = "abcaA_3287746823_abcaA"
outcome = re.match("(?P<tag>[a-zA-Z]+)_\d+_(?P=tag)", text)
print(outcome.group(0), outcome.group(1))
-------------------------------------------
abcaA_3287746823_abcaA
abcaA
注意:此时(?P=tag)
这个分组相当于没有,只有(?P<tag>[a-zA-Z]+)
分组,所以调用outcome.group(2)
会报错。
本文章使用limfx的vscode插件快速发布