正则表达式

var = re.compile((pattern), flags=0): 一般用于同一个正则表达式被调用多次,后续可通过重复调用var.model(text)进行字符串匹配,同re.model((pattern), text)方法一样。

flags类型

含义

re.I

不区分大小写

本部分内容提到的patterntext默认情况下均代表re.model((pattern), text)中意义。

1.1. re模块的使用

1.1.1. re.match

(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解释的意义。

1.2. 匹配字符

匹配字符

含义

.

表示任意字符,\n不算

\d

表示任意0-9之间的数字, 包括\n

\D

表示任意非0-9之间的字符, 包括\n

\s

表示空格字符,包括\n\t 等格式符号

\S

表示非空白符,与\s互斥

\w

大小写字母、数字和下划线

\W

非字母、非数字和非下划线,与\w互斥

\f

换页符

\n

换行符

\r

回车符

\t

制表符

\v

垂直制表符

\p

CR\LF(等同于\r\n)垂直制表符

符号

含义

*

表示匹配*之前的一个字符0至任意次,直到遇到非*之前字符

+

表示匹配+之前的一个字符1至任意次,直到遇到非+之前字符

?

表示匹配+之前的一个字符0或1次

{count}
{count,}
{count_left,count_right}

表示匹配{count}次之前的一个字符count
表示匹配{count}次之前的一个字符至少conut
表示匹配{count}次之前的一个字符count_leftcount_right

[^single_text]

用在[]中时为非符号,表示匹配非single_text的字符

(text)

用在()中text会被视为一个整体字符

\

转义字符,如要匹配\d[]这类字符时,可以在其前加上\

\|

表示以\|前面后面一位字符

text1(?=text2)

正先行断言,存在,表匹配后面紧跟着text2字符串的text1部分

text1(?!text2)

负先行断言,存在,表匹配后面不紧跟着text2字符串的text1部分

(?<=text2)text1

正后发断言,存在,表匹配前面紧跟着text2字符串的text1部分

(?<!text2)text1

负后发断言,存在,表匹配前面不紧跟着text2字符串的text1部分

注意?如果匹配了0次,即?前的字符在给定text中没有,或者text为空,也会输出,但是为'',而不是None。    {}中不要添加空格

1.3. 字符集

字符集类型

含义

示例(特殊用法)

[]

匹配[]中任意一个字符

[a-c]a-c任意小写字母、[0-6]0-6任意数字、[A-C]A-C任意大写字母、[a-zA-Z]任意不区分大小写a-z字母、[^a-c]取反

1.4. 单词边界

单词

含义

\b

表示到\b为止的内容为搜索内容

^

表示只匹配字符串text^后面一位字符作为起始的部分

$

表示只匹配字符串text$前面一位字符作为结尾的部分

## 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插件快速发布