赞
踩
[tT][hH][eE]
,这样的写法是没有问题的,但是如果单词较长,写起来就是比较麻烦的。比如:beautiful就要写成[bB][eE][aA][uU][tT][iI][fF][uU][lL]
。更重要的是,这样的表达式不够直观,很难明白此表达式要匹配的是beautiful
the
,就可以匹配the、THE、The、THe
等等各种大小写形式的the,提升了直观程度,还大大降低了理解的难度模式修饰符
(?modifier)(其中modifier为模式修饰符)
,嵌在正则表达式的开头。比如不区分大小写的模式对应的模式修饰符是i(case Insensitive),对于the来指定此模式,完整的表达式为(?i)the
import re
re.search(r"(?i)beautiful",'beautiful') is not None
re.search(r"(?i)beautiful",'Beautiful') is not None
re.search(r"(?i)beautiful",'BEAUTIFUL') is not None
预定义好的常量作为特殊参数传入来指定
语言 | 常量 |
---|---|
python | re.I或re.IGNORECASE |
如下举例:
import re
re.search(r"beautiful",'beautiful',re.I) is not None
re.search(r"beautiful",'Beautiful',re.IGNORECASE) is not None
(?i)the
与(?i)THE
是完全等价的描述 | 表达式 |
---|---|
提取超链接 | (?i)<a\s+href\s*=\s*["']?([^"'\s]+)["']?>([^<]+)</a> |
提取标题 | (?i)<head>([^>]+)</head> |
提取图片 | (?i)<img\s[^>]*?src=['"]?([^'"]+)['"]?[^>]*> |
.
几乎可以匹配任何字符,唯有换行符\n
是例外。但是,有是否确实需要匹配“任何字符”,比如我们在处理爬取到的HTML源码时,经常需要跨越多行取数据,如下:<script type="text/javascript">
...code...
...code...
</script>
.
不能匹配换行符”,不过部分人并不阅读与深究文档,所以认为.
点号能匹配任何字符,当然也包括换行符,所以直接想法就是<script\s.*?</script>
.*?
的匹配最多只能进行到第一行末尾,可以使用[\s\S]
之类的字符组匹配“任意字符”,所以正则表达式<script\s[\s\S]*?</script>
能解决问题.
来进行匹配(?s)<script\s.*?</script>
预定义常量如下:
语言 | 常量 |
---|---|
python | re.S或re.DOTALL |
.
点号的匹配规则:在默认的模式下,点号.
可以匹配除换行符之外的任何字符,在单行模式下点号可以匹配包括换行符在内的任何字符^
与$
的匹配规则:在默认的模式下^
与$
匹配的是整个字符串的起始位置与结束位置,但是在多行模式下,它们也能匹配字符串内部某一行文本的起始位置和结束位置1 one
No ycx
Yes wy
2 two
(?m)
指定多行模式,这样^
就可以定位到字符串内部的每一行的起始位置;匹配数字字符的表达式为\d
,因为没有指定单行模式。.
点号是不能匹配换行符的,.*
可以匹配数字字符之后的整行文本,所以表达式就是(?m)\d.*
如下测试:
import re
multiStr = """
1 one
No ycx
Yes wy
2 two
"""
multiRegex = r"(?m)\d.*"
for line in re.findall(multiRegex, multiStr):
print(line)
$
,给每一行末尾添加英文句号.
,如下:import re
multiStr = """1 one
No ycx
Yes wy
2 two"""
print(re.sub(r'(?m)$','.',multiStr))
语言 | 常量 |
---|---|
python | re.M或re.MUTILINE |
(?#comment)
的记法添加注释,comment是注释内容。所以,在我们的表达式^\d.*?$
就可以写成这样:^(?#start of the line)\d(?#digit).*?(?#rest of the line)
import re
multiStr = """1 one
No ycx
Yes wy
2 two"""
LineBeginRegex = r"""
(?mx) #enable multiline and extended mode
^ # start of the line
\d #digit
.* # est of the line
$ #end of the line
"""
re.findall(LineBeginRegex, multiStr)
#comment
的形式添加在正则表达式内部,每一条注释从#
开始,到行末结束。在许多的文档,都是用这种模式来解释较为复杂的表达式,并且会使用缩进表示层级结构,这样就更加方便阅读和维护。((?x)(\d{4})-(\d{2})-(\d{2}))
,在注释模式下的展开:dateRegex=r"""
(?x) # enable multiline ans extended mode
( # start of the regex
(\d{4}) # year
- # dash
(\d{2}) # month
- # dash
(\d{2}) # day
) # end of the regex
"""
re.search(dateRegex,"2022-01-02").group()
语言 | 常量 |
---|---|
python | re.X或re.VERROSE |
(?mx)
。如果需要同时使用多种匹配模式,只要在(?modifier)
中将模式修饰符排列起来即可|
,通常来说对应的预定义常量都是int类型,所以多个值进行按位与的结果,并不会彼此干扰,在python中是这样的re.M | re.X
,如下:import re
multiStr = """1 one
No ycx
Yes wy
2 two"""
LineBeginRegex = r"""
^ # start of the line
\d #digit
.* # est of the line
$ #end of the line
"""
re.findall(LineBeginRegex, multiStr, re.M | re.X)
python的还包含有其他模式(这里仅列举两种,更多的请查阅文档):
\d \w \s
等字符组简记法的匹配规则会发生改变,比如\w
能匹配Unicode中的“单词字符”,包括中文字符,\d
也能匹配1、2之类的全角数字字符,对应的模式修饰符是u
\d \w
等字符组简记法恢复到ASCII匹配规则,可以使用此模式,对应的模式修饰符是a
(?modifier)
的形式,它表示从现在开始使用此模式,通常的做法是将它写在正则表达式的开头,表示整个正则表达式都指定使用此模式;如果它出现正则表达式中,则表示此模式从这里开始生效,但是在python中情况不同,只要模式修饰符(?modifier)出现,无论出现在什么位置,都对整个正则表达式生效;如下:re.search(r"t(?i)he","THE").group()
((?modifier).....)
那它的作用范围只限于括号内部,此模式也可记为(?modifier:.....)
如下举例:
正则表达式 | 可匹配的文本 |
---|---|
t(?i)he | tHE the tHe thE |
th(?i)e | the thE |
t((?i)h)e | tHe the |
t(?i:h)e | tHe the |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。