当前位置:   article > 正文

python 正则 匹配任意字符串_python中正则匹配

python正则匹配任意字符

写代码时候,不管是爬虫,还是获取某些特定的资源,我们需要写正则表达式。 因为不常用,有些语法生疏。有时明明觉得自己的语法可以,可就是不行。

正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。 不管是python还是shell,都可以写正则。

正则表达式基本语法

头和尾

他们的作用是分别指出一个字符串的开始和结束。例子如下:

"^The":表示所有以"The"开始的字符串("There","The cat"等);

"of despair":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;

"notice":表示任何包含"notice"的字符串。

模糊匹配

'.'表示匹配任意的一个字符,相当于一个占位符号。

'',“没有或更多”

'+',“一次或更多”

'?',“没有或一次”

下面是几个例子:

"ab":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);

"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;

"ab?":表示一个字符串有一个a后面跟着零个或者一个b;

"a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。

分组和范围

() 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。

[]是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字。[\s]表示空格或者号。

{}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s{1,3}表示匹配一到三个空格。

你也可以使用范围,用大括号括起,用以表示重复次数的范围。

"ab{2}":表示一个字符串有一个a跟着2个b("abb");

"ab{2,}":表示一个字符串有一个a跟着至少2个b;

"ab{3,5}":表示一个字符串有一个a跟着3到5个b。

区别:

圆括号()是组,主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理

(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致。

方括号是单个匹配,字符集/排除字符集/命名字符集

示例:

1、[0-3],表示找到这一个位置上的字符只能是0到3这四个数字,与(abc|bcd|cde)的作用比较类似,但圆括号可以匹配多个连续的字符,而一对方括号只能匹配单个字符

2、[^0-3],表示找到这一个位置上的字符只能是除了0到3之外的所有字符

()内的内容表示的是一个子表达式,()本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处理

[]表示匹配的字符在[]中,并且只能出现一次,并且特殊字符写在[]会被当成普通字符来匹配

选择,'¦',表示“或”操作

"hi¦hello":表示一个字符串里有"hi"或者"hello";

"(b¦cd)ef":表示"bef"或"cdef";

"(a¦b)*c":表示一串"a""b"混合的字符串后面跟一个"c";

为了逐字表达,你必须在"^.$()¦*+?{"这些字符前加上转移字符''。

请注意在方括号中,不需要转义字符。

元字符及其在正则表达式上下文中的行为:

\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。

^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。也匹配 '\n' 或 '\r' 之前的位置

{n} n 是一个非负整数,匹配确定的n 次。

{n,} n 是一个非负整数,至少匹配n 次。

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。

? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。

. 匹配除 “\n” 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。

(pattern) 匹配pattern 并获取这一匹配。

(?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

(?!pattern) 负向预查,与(?=pattern)作用相反

x|y 匹配 x 或 y。

[xyz] 字符集合。

[^xyz] 负值字符集合。

[a-z] 字符范围,匹配指定范围内的任意字符。

[^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。

\b 匹配一个单词边界,也就是指单词和空格间的位置。

\B 匹配非单词边界。

\cx 匹配由x指明的控制字符。

\d 匹配一个数字字符。等价于 [0-9]。

\D 匹配一个非数字字符。等价于 [^0-9]。

\f 匹配一个换页符。等价于 \x0c 和 \cL。

\n 匹配一个换行符。等价于 \x0a 和 \cJ。

\r 匹配一个回车符。等价于 \x0d 和 \cM。

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。

\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t 匹配一个制表符。等价于 \x09 和 \cI。

\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。

\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。

\num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。

太多了,大概记住就行了。

贪婪与非贪婪

属于贪婪模式的量词,也叫做匹配优先量词,包括:

“{m,n}”、“{m,}”、“?”、“”和“+”。

在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:

“{m,n}?”、“{m,}?”、“??”、“?”和“+?”。

意思是说,跟人性一样,本性是贪婪的。但是,经过自己的反问,变得不贪婪了。

以下一些例子,来阐明这个

101000011000

1.* 结果:all, 贪婪的,所有匹配

1.? 结果:10,10,11, 非贪婪(最多一个,达到为止)

1.+ 结果:all, 贪婪的,所有匹配

1.*? 结果:非1 1 1 1 , 非贪婪的(点后面0个)

1.+? 结果:10,10,11,非贪婪的(点后面一个)

1.?+ no(不合法)

1.?* no (不合法)

1.*+ no(不合法)

1.+* no (不合法)

如果对自己写的表达式没有信心,可以找个工具检测以下。

网上很多工具,如:

检验: http://tool.oschina.net/regex/#

来检验一下,比如我们要匹配email地址

E-mail地址:我写的,\w+@\w+.\w+

虽然不是特别精确,但是基本功能能够满足了。

手机号码:^((\d2,3)|(\d{3}-))?13\d{9}$

[0-9]{11}

1[0-9]{10}

\d{11}

35、IP:

my: (\d+){1,3}.(\d+){1,3}.(\d+){1,3}.(\d+){1,3}

正则表达式也会有精度的。一般我们要把其特征点找出来,后面的就好办了。

更多精彩,请关注微信公众号:python爱好部落

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/113738
推荐阅读
相关标签
  

闽ICP备14008679号