python 正则语法

python 正则语法

正则的包import re

^

匹配模式的^代表开头。^b代表是b开头的。

.代表任意字符。*代表任意数量。

^b.*代表b开头的,任意字符的。

目标搜索字符串

line = "bobby123"

匹配模式

regex_str = "^b.*"

rematch函数,第1参数:目标字符串,第2参数:匹配模式。

$

匹配模式的$代表结尾。

3$表示必须是以3结尾的。

.*3$代表以3结尾,前面是任意字符串。

贪婪、()、?

匹配模式?是非贪婪模式。

目标字符串 line = "boooooooobby123"

需要把一串o前后紧邻的两个b包含的字符串提取出来。

匹配模式

regex_str = ".*(b.*b).*"

注意这里是提取匹配字符串中子集(b.*b)

import re

line = "boooooooobby123"

regex_str = ".*(b.*b).*"

match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))

最后得到的

bb

因为非贪婪模式,是从后往前、从右往左匹配。所以找到bby123前两位。

非贪婪模式,就是加上?,从左边开始匹配。

regex_str = ".*?(b.*b).*"

得到

boooooooobb

因为后面也是贪婪模式。所有b都提取。

如果只要boooooooob就是匹配中,后面的b前面也加?。遇到后面第一个b就返回。

regex_str = ".*?(b.*?b).*"

+

目标字符串

line = "boooooooobaaasdboooooooobbaaaby123"

匹配模式

regex_str = ".*(b.+b).*"

也是从后面匹配。

+代表至少出现1次。

{1} {2,5} {2,}

{1}代表出现不多不少就1次。

{2,5}出现最少两次,最多5次。

|

import re

line = "bobby123"

regex_str = "bobby|bobby123"

match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))

会报错。因为group对应子集。匹配模式regre_str中没有括号代表的子集。把括号加上去。

regex_str = "(bobby|bobby123)"

得到

bobby

如果是

regex_str = "(bobby123|bobby)"

得到

bobby123

(())

先提外层座位group(1),然后才是group(2)的内层。

line = "boobby123"

regex_str = "((bobby|boobby)123)"

match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))

得到

boobby123

[]

1 任一字符

中括号表示其中任一一个都可以。[abcd] 是a, b, c, d中任何一个都可以。

import re

line = "boobby123"
regex_str = "([abcd]oobby123)"

match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))

得到

boobby123

2 区间

另外比如电话号码18782902222

regex_str = "1[48357]"

第一位是1,第二位是[48357]数字中的任何一位。可以是13几、18几等等,但不可以是12几。

中括号还可以表示区间[0-9],代表0到9中的数字。{0}是9位数字。

line = "18782902222"
regex_str = "(1[48357][0-9]{9})"

3 不等于

import re

line = "18sssssssss"
regex_str = "(1[48357][^1]{9})"

match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))

18sssssssss

中括号中组合起来

line = "你_好"
regex_str = "(你[A-Za-z0-9_]好)"

你_好

\s \S

\s 空格

line = "你 好"
regex_str = "(你\s好)"

你 好

\S 不为空格

如果要多个

line = "你很sww好"
regex_str = "(你\S+好)"

你很sww好

\w

\w匹配包括下划线的任何单词字符,但不包含标点符号如',',它等价于[A-Za-z0-9_];

\W相反,代表与\w相反的字符。

\u4E00-\u9FA5

[\u4E00-\u9FA5]只提取汉字。

import re

line = "你好w"
regex_str = "([\u4E00-\u9FA5]+)"

match_obj = re.match(regex_str, line)
if match_obj:
    print(match_obj.group(1))

你好。

regex_str = ".*([\u4E00-\u9FA5]大学)"
regex_str = ".*([\u4E00-\u9FA5]+大学)"

这两个都是只得到:

京大学

因为贪婪模式,右边开始有了就可以了。

regex_str = ".*?([\u4E00-\u9FA5]+大学)"

得到

南京大学

加上?,从左到右。

regex_str = ".*?(\d{4})年"

?取消非贪婪

或者可以指定4位数

regex_str = ".*(\d{4})年"

推荐阅读更多精彩内容

  • 温馨提示:文章很长很长,保持耐心,必要时可以跳着看,当然用来查也是不错的。 正则啊,就像一座灯塔,当你在字符串的海...
    Stinson阅读 2,558评论 3赞 74
  • 替换后到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 821评论 0赞 9
  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 1,894评论 0赞 19
  • re模块手册 本模块提供了和Perl里的替换后类似的功能,不关是替换后本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 2,224评论 0赞 12
  • 又是秋天。枫叶染红了谁的思念?叹流年,伊人入梦,千回百转。—— 选自君若尘的博客《芳草连天长,人在天涯又何妨?》 ...
    葛芳阅读 82评论 1赞 7