Python-正则表达式

#一、正则表达式介绍
正则表达式(称为RE,或正则,或正则表达式模式)指定了一组与之匹配的字符串;本质上是嵌入在Python中的一种微小的、高度专业化的编程语言,可通过 re 模块获得。

#二、使用正则
###1. 常用方法
#####1.1 match
只在整个字符串的起始位置进行匹配

>>> import re
>>> string = "night life space 1234"

>>> r = re.match("ni", string)
>>> r.group()    
'ni'

# 分组
>>> r = re.match("ni(\w+)", string)
>>> r.group()     # 匹配成功的结果
'night'
>>> r.groups()     # 获取分组的结果
('ght',)

#####1.2 search
从整个字符串的开头找到最后,当第一个匹配成功后,就不再继续匹配。

>>> string = "night life space 1234"

>>> r = re.search("i\w+", string)
>>> r.group()
'ight'

#####1.3 findall
搜索整个字符串,找到所有匹配成功的字符串,比把这些字符串放在一个列表中返回。

>>> string = "night life space 1234"

>>> r = re.findall("i\w+", string)
>>> r
['ight', 'ife']

#####1.4 sub
把匹配成功的字符串,进行替换。

>>> string = "night life space 1234"

>>> r = re.sub("i\w+", "ppp", string, 2)     #("匹配规则", "替换的内容", 搜索对象, 替换几个 不写即为所有)
>>> r
'nppp lppp space 1234'

# 匹配成功时,会返回替换后的字符串
# 匹配失败时,会返回原来的字符串

# 分组
>>> tag = 'value="1997/07/01"'
>>> s = re.sub(r'(value="\d{4})/(\d{2})/(\d{2})"', r'\1年\2月\3日', tag)
>>> s
'value="1997年07月01日'

#####1.5 split
以匹配到的字符进行分割,返回分割后的列表

>>> string = "night life space 1234"

>>> r = re.split("i", string, 1)     # (“分隔字符”, 搜索对象, 分割几个)
>>> r
['n', 'ght life space 1234']

使用多个界定符分割字符串

>>> line = "asdf jtrgs; okmfd, ldfv."
>>> re.split('[\s;]', line)
['asdf', 'jtrgs', '', 'okmfd,', 'ldfv.']

>>> re.split('[\s;]\s*', line)     # *代表一个或多个
['asdf', 'jtrgs', 'okmfd,', 'ldfv.']

#三、匹配字符
###1. 普通字符
大多数字母和字符只会匹配自己。 例如,正则表达式 test将完全匹配字符串 test
你可以启用一个不区分大小写的模式,让这个正则匹配 Test 或 TEST

###2. 特殊字符
一些字符是特殊的 metacharacters (元字符),并且不匹配自己。 相反,它们表示应该匹配一些与众不同的东西,或者通过重复它们或改变它们的含义来影响正则的其他部分。

接下来一个一个介绍,在展示示例的时候,我使用了 re 模块中的 search() 方法。这个方法就是从整个字符串的开头查找符合正则模式的字符,直到找到第一个匹配的字符为止,后面假如还有符合的字符串,也不会继续匹配。

返回的是一个 RE 对象,匹配到的内容会作为对象 match 属性的值。

正则特殊字符匹配内容
.匹配除换行符(\n)以外的单个任意字符
^匹配整个字符串的开头
$匹配整个字符串的结尾
[]匹配中括号内字符中的任何一个 比如:[1a]匹配到 1或者 a
[-]匹配连续的字符范围 比如 [0-9]表示 09之间的任意一个数字
\w匹配单个字母、数字、汉字或下划线 类似于 [a-z A-Z 0-9 _ ]
\W匹配任何不是单词字符的字符。 这与 \w 正相反。类似于 [!a-z A-Z 0-9 _ ]
\d匹配单个数字 [0-9] 其中一个
\s匹配单个任意的空白符,这等价于 [ \t\n\r\f\v]
\S匹配任何非空白字符, [^ \t\n\r\f\v]
\b匹配单词边界
\|表示或的关系,比如 A\|B, A 和 B 可以是任意正则表达式,创建一个正则表达式,匹配 A 或者 B。循环扫描字符串时,一旦 A 匹配成功, B 就不再进行匹配。如果要匹配 \|字符,使用 \\|, 或者把它包含在字符集里,比如 [\|]
(...)(组合),匹配括号内的任意正则表达式,并标识出组合的开始和结尾。匹配完成后,组合的内容可以被获取,并可以在之后用 \number 转义序列进行再次匹配
  • [0-9 a-z A-z]表示 0 1 2 3 4 5 6 7 8 9 其中任何一个数字,或者 26 个英文字符大小写的任何一个。
  • \w, \s , \d可以包含在中括号中。 例如,[\s, .]是一个匹配任何空格字符的字符类或者 ',''.'

#####注
[]

# 注意,在 中括号 [] 内的任何元字符都不生效,都会成为普通的字符,只能匹配到自身。
比如:[akm$] 将匹配'a','k'、'm' 或 '$' 中的任意一个字符;'$' 通常是一个元字符,
但在一个中括号内它被剥夺了特殊性。

>>> s1 = '$520.00'
>>> re.search('00$', s1)
<re.Match object; span=(5, 7), match='00'>
>>> re.search('[00$]', s1)
<re.Match object; span=(0, 1), match='$'>

^ 在中括号中是取反的意思,比如 [^a58] 匹配到不是 a 、5 、8 中的任意一个其他字符 。

>>> s2 = 'ab58abc'
>>> re.search('[^a58]', s2)
<re.Match object; span=(1, 2), match='b'>

\b

注意,通常 \b 定义为 \w 和 \W 之间的边界,或者 \w 和字符串开始/结尾的边界, 
意思就是 r'\bfoo\b' 匹配 'foo', 'foo.', '(foo)', 'bar foo baz' 但不匹配 'foobar' 或者 'foo3'。

>>> s3 = 'hello2020 hello.'
>>> re.search('hello', s3)
<re.Match object; span=(0, 5), match='hello'>
>>> re.search(r'\bhello\b', s3)
<re.Match object; span=(10, 15), match='hello'>

(...)

>>> s = "moon night 2020 "
>>> re.search('(ght)', s)
<re.Match object; span=(7, 10), match='ght'>

#####重复次数匹配:

正则特殊字符匹配内容示例
*对它前面的正则模式匹配0到任意次重复, 尽量多的匹配字符串。ab*会匹配 ‘a’, ‘ab’, 或者 'a’后面跟随任意个 ‘b’。
+对它前面的正则式匹配1到任意次重复。lv6+匹配 lv 后面跟随1个以上到任意个 ‘6’,它不会匹配 ‘lv’
?对它前面的一个正则模式匹配0到1次重复。lv6?匹配 lv 和 lv6
{m}重复它前一个正则模式 m 次a{2}匹配 aa
{m,}重复它前一个正则模式 m 次或 m 次以上a{2,}匹配 aa 或连续两个 a以上

#####关于原始字符串
正则表达式使用反斜杠\来表示特殊形式,或者把特殊字符转义成普通字符。 而反斜杠在普通的 Python 字符串里也有相同的作用,所以就产生了冲突。比如说,要匹配一个字面上的反斜杠,正则表达式模式不得不写成 \\\\,因为正则表达式里匹配一个反斜杠必须是 \\,而每个反斜杠在普通的 Python 字符串里都要写成 \\

解决办法是对于正则表达式样式使用 Python 的原始字符串表示法;在带有 r前缀的字符串字面值中,反斜杠不必做任何特殊处理。 因此 r"\n"表示包含 \n两个字符的字符串,而 \n则表示只包含一个换行符的字符串。 样式在 Python 代码中通常都会使用这种原始字符串表示法来表示。

#####贪婪 和 非贪婪

# 匹配所有包含小数在内的数字
print(re.findall('\d+\.?\d*',"asdfasdf123as1.13dfa12adsf1asdf3")) #['123', '1.13', '12', '1', '3']

#.*默认为贪婪匹配
print(re.findall('a.*b','a1b22222222b')) #['a1b22222222b']

#.*?为非贪婪匹配:推荐使用
print(re.findall('a.*?b','a1b22222222b')) #['a1b']

#四、常用正则
#####邮箱账号

chen123@qq.com
chen123@163.com

r'\w+@(163|126|qq|139).(com|cn)'
或者
r'[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+'

#####手机号

r'1( 5[02689]|3\d|7[279]|8\d)\d{8}'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值