龙空技术网

Python正则表达式之二:转义字符与数量匹配

洪较瘦不着调退役it人 116

前言:

眼前各位老铁们对“python正则匹配多个空格”都比较珍视,咱们都想要分析一些“python正则匹配多个空格”的相关知识。那么小编同时在网摘上汇集了一些有关“python正则匹配多个空格””的相关资讯,希望兄弟们能喜欢,姐妹们一起来了解一下吧!

先记录几个英文单词

backslash \这是反斜线

我们知道 \ 是正则表达式的关键字,但是有时字符串里面需要这个[ . \ 这些特殊字符,需要把它当你一个普通字符来对待,于是这个时候需要进行特殊处理了。

例如我们知道英文的句话 . 可以代表任意字符

但是像下面的字符串里面“foo.bar”中间包含一点. 要通过正则表达式查找 ,首先我们想到的是

>>> re.search('.', 'foo.bar') 2<_sre.SRE_Match object; span=(0, 1), match='f'>

显然直接这样写是不行的,这个时候英文的句话并没有当作普通字符来对待,因此是无法匹配

\. 告诉re请反英文的点当作普通的字符处理

>>> re.search('\.', 'foo.bar') 5<_sre.SRE_Match object; span=(3, 4), match='.'>

这样就能通过正则表达式匹配出,foo.bar中包含英文的句话.

字符串中有反斜线 \

>>> s = r'foo\bar'>>> print(s)foo\bar

正宗的操作是在字符串前面加一个 r,否则代码是会报错的,于是我写了三种例子b

   s = r'foo\bar's_1 = "foo\bar"s_2 = "foo\\bar"print(s) print(s_1) print(s_2) 

大家可以思考下结果:

foo\barfooarfoo\bar

\\来实现正则表达式

import ret = re.search('\\', s)print(t)
Traceback (most recent call last):  File "c:\users\admin\appdata\local\programs\python\python38\lib\sre_parse.py", line 245, in __next    raise error("bad escape (end of pattern)",re.error: bad escape (end of pattern) at position 0

实际上这样并不能正确的模式匹配直接报错了

'\\'是一个字符串,实际上它代表的就是单个反斜线间个反斜线传入到解释器中代表的不是一个下正确的表达式,因为就直接错误了

于是我稍微修改了一下这个代码 r'\\'

import ret = re.search(r'\\', s)print(t)
也可以这样实现 '\\\\'
>>> re.search('\\\\', s)<_sre.SRE_Match object; span=(3, 4), match='\\'>
在字符串层面 '\\\\' 其实就是 '\\'\\ 正则表达式层面就表示一个完整的式子,把 \ 当作一个普通反斜线匹配字符串^ \A 以什么开头
>>> re.search('^foo', 'foobar')<_sre.SRE_Match object; span=(0, 3), match='foo'>>>> print(re.search('^foo', 'barfoo'))None

判断字符串是否以 foo开头 ^ 表示要查找的字符串需要以foo开头

$ \Z 以什么结尾

判断字符串以 bar 结尾

>>> re.search('bar$', 'foobar')<_sre.SRE_Match object; span=(3, 6), match='bar'>>>> print(re.search('bar$', 'barfoo'))None>>> re.search('bar\Z', 'foobar')<_sre.SRE_Match object; span=(3, 6), match='bar'>>>> print(re.search('bar\Z', 'barfoo'))None
>>> re.search('bar$', 'foobar\n')<_sre.SRE_Match object; span=(3, 6), match='bar'>
\b要搜索的单词矸字符串是是开头或者结尾

如何区分一个字符串中的两个单词,空格或者.分隔的两个字母其实可以当作是两个单词

>>> re.search(r'\bbar', 'foo bar') <_sre.SRE_Match object; span=(4, 7), match='bar'>>>> re.search(r'\bbar', 'foo.bar') <_sre.SRE_Match object; span=(4, 7), match='bar'> >>> print(re.search(r'\bbar', 'foobar')) None  >>> re.search(r'foo\b', 'foo bar')<_sre.SRE_Match object; span=(0, 3), match='foo'>  >>> re.search(r'foo\b', 'foo.bar')<_sre.SRE_Match object; span=(0, 3), match='foo'>>>> print(re.search(r'foo\b', 'foobar'))None
re.search(r'foo\b', 'foo.bar') 这也可以认为是两个单词

稍微复杂一点的例子

>>> re.search(r'\bbar\b', 'foo bar baz')<_sre.SRE_Match object; span=(4, 7), match='bar'>>>> re.search(r'\bbar\b', 'foo(bar)baz')<_sre.SRE_Match object; span=(4, 7), match='bar'>>>> print(re.search(r'\bbar\b', 'foobarbaz'))None

\B与\b 的作用相反

>>> print(re.search(r'\Bfoo\B', 'foo')) None>>> print(re.search(r'\Bfoo\B', '.foo.'))  None >>> re.search(r'\Bfoo\B', 'barfoobaz')  <_sre.SRE_Match object; span=(3, 6), match='foo'>
匹配数量 * 0个或者多个a* 代表着有0个或者 多个a 即 'a', 'aa', 'aaa'....
>>> re.search('foo-*bar', 'foobar')                     # Zero dashes <_sre.SRE_Match object; span=(0, 6), match='foobar'> >>> re.search('foo-*bar', 'foo-bar')                    # One dash <_sre.SRE_Match object; span=(0, 7), match='foo-bar'> >>> re.search('foo-*bar', 'foo--bar')                   # Two dashes <_sre.SRE_Match object; span=(0, 8), match='foo--bar'> 
foo-*bar 与 foobar是匹配的,因为可以没有 -'foo-*bar与 foo-ba是匹配的+ 至少一个或者多个
>>> print(re.search('foo-+bar', 'foobar'))              # Zero dashes   None>>> re.search('foo-+bar', 'foo-bar')                    # One dash <_sre.SRE_Match object; span=(0, 7), match='foo-bar'> >>> re.search('foo-+bar', 'foo--bar')                   # Two dashes <_sre.SRE_Match object; span=(0, 8), match='foo--bar'>

foo-+ba与 foobar是不匹配的,因此至少有一个-

?匹配0个或者1个

>>> re.search('foo-?bar', 'foobar')                     # Zero dashes <_sre.SRE_Match object; span=(0, 6), match='foobar'>>>> re.search('foo-?bar', 'foo-bar')                    # One dash  <_sre.SRE_Match object; span=(0, 7), match='foo-bar'>>>> print(re.search('foo-?bar', 'foo--bar'))            # Two dashes    None
限制匹配的次数m,n ,可以使用[m,n]* 可以理解为[0, ]+ 可以理解为[1 ,]? 可以理解为[0,1]
>>> re.match('foo[1-9]*bar', 'foobar')<_sre.SRE_Match object; span=(0, 6), match='foobar'>>>> re.match('foo[1-9]*bar', 'foo42bar')<_sre.SRE_Match object; span=(0, 8), match='foo42bar'>>>> print(re.match('foo[1-9]+bar', 'foobar'))None>>> re.match('foo[1-9]+bar', 'foo42bar')<_sre.SRE_Match object; span=(0, 8), match='foo42bar'>>>> re.match('foo[1-9]?bar', 'foobar')<_sre.SRE_Match object; span=(0, 6), match='foobar'>>>> print(re.match('foo[1-9]?bar', 'foo42bar'))None
未完待续

下一篇:

*?

+?

??

标签: #python正则匹配多个空格 #python 匹配中文字符 #正则表达式特殊字符转义 #正则需要转义的字符 #正则表达式中特殊字符转义