
通过演示前进可以成功的地方,它有助于具体实现. 考虑一个用于匹配文件名的简单模式,并将其分为两部分,基本名称和扩展名“. ”. 与“ news.rc”一样,“ news”是基本名称,“ rc”是文件扩展名.
匹配模式非常简单:
.*[.].*$
请注意,“. ”需要特殊处理,因为它是一个元字符;我把它放在一个角色类中. 另请注意以下$;这样做是为了确保扩展名中必须包含字符串的所有其余部分. 此正则表达式匹配“ foo.bar”,“ autoexec.bat”,“ sendmail.cf”和“ printers.conf”.
现在,考虑使问题复杂化;如果要匹配扩展名不是“ bat”的文件名怎么办?一些不正确的尝试:
.*[.][^b].*$
首次尝试删除上面的“ bat”要求扩展名的第一个字符不是“ b”. 这是错误的,因为该模式也无法匹配“ foo.bar”.
.*[.]([^b]..|.[^a].|..[^t])$
当您尝试解决第一个解决方案并要求匹配以下情况之一时,该表达式甚至更加混乱: 扩展名的第一个字符不是“ b”;第二个字符不是“ a”;或第三个字符不是“ t”. 这将接受“ foo.bar”并拒绝“ autoexec.bat”,但这需要三个字符的扩展名,而不是诸如“ sendmail.cf”的两个字符的扩展名. 我们将在努力修复该模型时再次使其复杂化.
.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$
在第三次尝试中,第二个和第三个字母都变为可选,以便允许扩展名少于三个字符,例如“ sendmail.cf”.
该模式现在非常复杂,难以阅读. 更糟糕的是,如果问题发生了变化,并且您希望扩展名不是“ bat”和“ exe”,则该模式将变得更加复杂和混乱.
正向否定将所有这些都裁剪为:
.*[.](?!bat$).*$
正向含义: 如果bat表达式在此处不匹配,请尝试模式的其余部分;否则,请试一试. 如果bat $匹配,则整个模式将失败. 为了确保允许以“ bat”开头的扩展名(例如“ sample.batch”),必须使用以下$.
排除其他文件扩展名现在很容易;只需将其作为定界符中的选项即可. 以下模式不包括以“ bat”或“ exe”结尾的文件名.

.*[.](?!bat$|exe$).*$
到目前为止,我们仅搜索了静态字符串. 通常,通过以下“ RegexObject”方法以不同的方式修改正则表达式,以修改字符串.
方法/属性
功能
split()
将RE匹配的字符串分片,并生成列表,
sub()
找到所有与RE匹配的子字符串,并用其他字符串替换
subn()
与sub()相同,但返回新字符串和替换次数
RegexObject的split()方法在RE匹配的地方分割字符串,并返回一个列表. 它类似于字符串的split()方法,但是提供了更多的定界符. split()仅支持空格和固定字符串. 如您所料,还有一个模块级的re.split()函数.
split(string [, maxsplit = 0])
使用正则表达式拆分字符串. 如果在RE中使用了捕获括号,那么它们的内容也将作为结果列表的一部分返回. 如果maxsplit不为零,则最多可以拆分maxsplit碎片.
您可以通过设置maxsplit值来限制分片的数量. 当maxsplit不为零时,最多可以有maxsplit条带,其余字符串作为列表的最后一部分返回. 在下面的示例中,分隔符可以是任何非字母数字字符序列.
#!python
>>> p = re.compile(r'\W+')
>>> p.split('This is a test, short and sweet, of split().')
['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', '']
>>> p.split('This is a test, short and sweet, of split().', 3)
['This', 'is', 'a', 'test, short and sweet, of split().']
有时,您不仅对定界符之间的文本感兴趣,而且还需要知道什么是定界符. 如果在RE中使用了括号,那么它们的值也将作为列表的一部分返回. 比较以下调用:

#!python
>>> p = re.compile(r'\W+')
>>> p2 = re.compile(r'(\W+)')
>>> p.split('This... is a test.')
['This', 'is', 'a', 'test', '']
>>> p2.split('This... is a test.')
['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']
模块级函数re.split()以RE作为第一个参数,其他参数相同.
#!python
>>> re.split('[\W]+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('([\W]+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('[\W]+', 'Words, words, words.', 1)
['Words', 'words, words.']
其他常见用途是查找所有与模式匹配的字符串,并将其替换为其他字符串. sub()方法提供替换值(可以是字符串或函数)以及要处理的字符串.
sub(replacement, string[, count = 0])
返回的字符串将替换为字符串中RE的最左侧唯一匹配项. 如果找不到该模式,则将返回该字符而不会更改.
可选参数计数是模式匹配后的最大替换次数; count必须是非负整数. 默认值为0,以替换所有匹配项.
这是一个使用sub()方法的简单示例. 它将颜色名称替换为“颜色”一词.
#!python
>>> p = re.compile( '(blue|white|red)')
>>> p.sub( 'colour', 'blue socks and red shoes')
'colour socks and colour shoes'
>>> p.sub( 'colour', 'blue socks and red shoes', count=1)
'colour socks and red shoes'
The
subn()方法执行相同的操作,但是它返回一个包含新字符串和已执行替换次数的二元组.
#!python
>>> p = re.compile( '(blue|white|red)')
>>> p.subn( 'colour', 'blue socks and red shoes')
('colour socks and colour shoes', 2)
>>> p.subn( 'colour', 'no colours at all')
('no colours at all', 0)
如果空匹配不位于前一个匹配旁边,则将替换它们.
#!python
>>> p = re.compile('x*')
>>> p.sub('-', 'abxd')
'-a-b-d-'
如果替换字符串,则将处理其中的任何反斜杠. “ \ n”将转换为换行符,“ \ r”将转换为回车符,依此类推. 诸如“ \ j”之类的未知转义符将保留原样. 反向引用(例如“ \ 6”)与RE中的相应组匹配,并由子字符串替换. 这样,您就可以在替换的字符串中插入部分原始文本.
此示例匹配括在“ {”和“}”中的单词“ section”,并将“ section”替换为“ subsection”.

#!python
>>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)
>>> p.sub(r'subsection{\1}','section{First} section{second}')
'subsection{First} subsection{second}'
您还可以指定使用(?P
#!python
>>> p = re.compile('section{ (?P<name> [^}]* ) }', re.VERBOSE)
>>> p.sub(r'subsection{\1}','section{First}')
'subsection{First}'
>>> p.sub(r'subsection{\g<1>}','section{First}')
'subsection{First}'
>>> p.sub(r'subsection{\g<name>}','section{First}')
'subsection{First}'
替换也可以是一个功能,甚至可以给您更多的控制权. 如果替换是一个函数,则模式中的每个唯一匹配项都会调用该函数. 在每次调用时,该函数均用作“ MatchObject”的匹配函数,并且此信息可用于计算期望的字符串并返回它.
在下面的示例中,替换函数将十进制转换为十六进制:
#!python
>>> def hexrepl( match ):
... "Return the hex string for a decimal number"
... value = int( match.group() )
... return hex(value)
...
>>> p = re.compile(r'\d+')
>>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
'Call 0xffd2 for printing, 0xc000 for user code.'
使用模块级re.sub()函数时python 正则匹配,mode是第一个参数. 该模式可以是字符串或“ RegexObject”;如果需要指定正则表达式标志,则必须使用RegexObject作为第一个参数,或者使用模式内置修饰符,例如sub(“(?i)b +”,“ x”,“ bbbb BBBB” )返回“ x x”.
对于某些应用程序,正则表达式是一个功能强大的工具,但是在某些情况下,它不直观,有时它们无法按预期工作. 本节将指出最可能发生的一些最常见的错误.
有时使用re模块是错误的. 如果您匹配固定的字符串或单个字符类,并且不使用IGNORECASE标志re的任何功能,则无需使用正则表达式. 有一些操作固定字符串的方法,它们通常要快得多,因为它们是经过优化的C小循环,可以代替大型的,更通用的正则表达式引擎.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-242372-1.html
我一礼拜喝三次左右
千玺就像现实版的真人小王子