python中关于正则表达式四
[] 用来暗示一个字符串集合,
1.在这个集合中:字符串可以被 独特列出,例如[amk]将会匹配'a','m'或者'k'。
2.字符串的范围可以被暗示通过给两个字符串和分开它们用一个'-';例如[a-z]将会匹配任何小写ASCLL字幕,[0-5][0-9]将会匹配所有的两个数字从00到59,而[0-9A-Fa-f]将会匹配任何十六进制数值。如果 - 是转义(例如[a\-z])或者它是被放置在第一个或者最后字符(例如[a-]),那么它会匹配一个序列'-' 即a - z随意匹配一个
3.特别的字符失去它们特别的意思在这个集合。例如,[(+*)] 将会匹配任何序列字符'(', '+', '*' , 或者 ')'
4.字符串类比如\w或者\s(在下面定义)也尝试在一个集合,虽然这个字符串他们匹配依赖于是否LOCALE或者UNICODE模式有效
5.字符串不再范围内的可能匹配通过补足集合。如果集合的第一个字符是'^',那么所有的字符串不再这个集合的将会匹配,例如,[^5]将会匹配任何字符除了'5',而[^^]将会匹配任何字符除了'^',^没有特殊的意思如果他不是这个集合的第一个字符。
6.为了在一个集合中匹配字符序列']' ,先于它可能是一个反斜杠,或者放置它在集合的开始。例如,[()[\]{}]和[]()[{}]将会都匹配一个父元素
'|' A|B,在A和B任意的RE,创造一个正则表达式将会匹配A或者B。一个武断的数字正则表达式用'|'来分开用这种方式。这可能在一个组(下面)使用。当目标字符串扫描时,RE分开用'|'尝试着从左边到右边。当一个模式完全匹配,那么主干接受。这意味着一旦A匹配,B将不会再测试了。即使它可能会有一个更长的全部的匹配。换句话话,'|'操作符从来不是贪婪地。为了匹配序列'|',使用\|或者在有一个字符串类中闭合它,比如[|]
(…) 匹配无论正则表达式是在圆括号内,暗示着一个小组的开始和结束;小组的内容是会被处理在一个已经被执行的匹配后面,而且会匹配在字符串用\number字符串序列,描述如下。为了匹配序列'(' 或者 ')',用\( 或者 \),或者闭合它们用一个字符串类: [(][)]
(?...) 这是一个延长标记(一个'a'跟随着一个'('否则不是一个有意义的)。第一个字符串在'?'决定意义是什么和更远的语法属于这个构造函数。延长通常不会创建一个新的小组;(?P<name>…)是这个规则的意外。跟随是精准地支持扩展。
(?iLmsux) (一个或者更多的字符从集合'I','L','m','s','u','x')。这个组匹配整个空的字符串;字母集合跟标记一直:re.I(忽视大小写),re.L(场所依赖),re.M(多行),re.S(不要匹配全部),re.U(Unicoid 依赖),和re.X(繁杂的).对于整个正则表达式。(这个标记描述在module文本).这是有用的如果你希望可以包括标签作为正则表达式的一部分,代替过掉一个标记争吵用re.compile()函数
注意(?x)标记改变表达式的解析,它应该是首先在表达式字符串中有用的,或者在一个或者更多白空的字符串之后。如果这里是非空白字符串在一个标记后,那么结果是未定义。
(?:…) 一个非捕获的版本正则表达式括号。匹配无论正则表达式。但是自序列匹配用一个小组不能被处理在一个执行匹配或者参考之后在一个模式中
(?P<name>…) 相似和正则括号,但是字序列匹配用一个小组是可用通过象征性符号小组名 name。组名必须是有效的python标识符,并且每个小组名字必须是定义仅仅一次用一个正则表达式。一个象征符号小组也是一个数字的小组,仅仅好像小组没有命名。
命名小组 可以被引用在三个文本中,如果模式是(?P<quote>[’"]).*?(?P=quote) 这会匹配一个字符引用用单个或两个引用
(?P=name) 一个回溯引用给一个命名的小组;它匹配无论文本是匹配被之前小组命名过
(?#...) 一个评论,括号里面的文本可以简单地忽略
(?=…) 匹配如果… 匹配下一个,但是不消费任何字符。这是被叫做前瞻断言。例如,Isaac(?=Asimov)将会匹配'Isaac'仅仅如果后面跟随的是'Asimov'
(?!...) 匹配如果…不匹配下面。这是一个消极的前瞻断言。例如,Isaac(?!Asimov)将会匹配'Isaac'仅仅只有那不是跟随被'Asimov'
(?<=...)
Matches if the current position in the string is preceded by a match for ... that ends at the current position. This is called a positive lookbehind assertion. (?<=abc)def will find a match in abcdef, since the lookbehind will back up 3 characters and check if the contained pattern matches. The contained pattern must only match strings of some fixed length, meaning that abc or a|b are allowed, but a* and a{3,4} are not. Group references are not supported even if they match strings of some fixed length. Note that patterns which start with positive lookbehind assertions will not match at the beginning of the string being searched; you will most likely want to use the search() function rather than the match() function:
>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
This example looks for a word following a hyphen:
这个例子寻找一个词跟随在一个连字符-之后
>>> m = re.search('(?<=-)\w+', 'spam-egg')
>>> m.group(0)
'egg'
(?<=…) 匹配如果目前的位置在字符串中是先验被一个匹配为了… 那么结束在目前的位置。这是叫做一个积极的回顾性断言。(?<=abc)定义将会发现一个匹配在abcdef,自从这个回顾性将会支持3个字符串并且检查是否包含了模式匹配。包含的模式必须仅仅匹配一些修复长度的字符串,意味着abc或者a|b是被允许,但是a*和a{3,4}是没有。组参考是不支持,甚至它们匹配字符串对于一些修复的长度。注意模式货开始积极地前瞻性断言将不会匹配在字符串被搜索的开头;你将会尽可能地想要去用search()函数而不是match()函数:
(?<!...)
Matches if the current position in the string is not preceded by a match for .... This is called a negative lookbehind assertion. Similar to positive lookbehind assertions, the contained pattern must only match strings of some fixed length and shouldn’t contain group references. Patterns which start with negative lookbehind assertions may match at the beginning of the string being searched.
(?<!...) 匹配如果目前的位置在字符串中是没有先验被一个匹配为了…,这是叫作一种消极的回顾性断言。相似的积极性回顾性断言,这包含了模式必须仅仅匹配字符串对于一些修复的长度和不应该包含组参考。模式会开始用消极的回顾可能会匹配在字符串被搜索的开头。
(?(id/name)yes-pattern|no-pattern)
Will try to match with yes-pattern if the group with given id or name exists, and with no-pattern if it doesn’t. no-pattern is optional and can be omitted. For example, (<)?(\w+@\w+(?:\.\w+)+)(?(1)>) is a poor email matching pattern, which will match with '<user@host.com>' as well as 'user@host.com', but not with '<user@host.com'.
(?(id/name)yes-pattern|no-pattern) 尝试去匹配yes模式如果组是被给了id或者名字存在,而且no-pattern如果它不会。no-pattern是乐观的而且可能被忽略。例如,(<)?(\w+@\w+(?:\.\w+)+)(?(1)>)是可怜的email匹配模式,这将匹配'<user@host.com>' 和'user@host.com', 但不是 '<user@host.com'.
在新的版本2.4中,
特定的序列包含了'\'和一个字符来自一个被给的列表。如果这种普通的字符是不在列表中,那么产生RE将会匹配第二种字符.例如,\$匹配字符'$'
\number 匹配属于同样数字中的小组内容。小组是数字从1开始。例如,(.+)\1匹配'the the' 或者'55 55',但不是'thethe'(注意小组之后的空白).这指代序列能仅仅用于去匹配一个99小组。如果第一个数字是0,或者数字是八进制的3,那么将不会解释作为一个小组匹配,但是作为一个字符带有八进制数值的。在'['和']'属于一个字符串类,所有的数字忽略被处理作为字符。
\A 匹配仅仅在字符串的开始。
\b 匹配空的字符串,但是仅仅在单词的开头或者结尾。一个单词是被定义作为一个字母数字序列或者数字下划线字符。注意正常地,\b是定义作为a \w和 a \W 字符的边界(或者反之亦然),或者在\w和字符串的开始/结束,所以这个字符串的精准的集合被认为是字母数字取决于UNICODE和LOCALE标记的值。例如,r'\bfoo\b'匹配'foo','foo.','(foo)','bar foo bar'但不是'foobar'或者'foo3'。在一个字符串范围内,\b代表这回车字符,为了python字符序列的兼容性。
\B 匹配空的字符串,但是仅仅当它不是在单词的开头或者结尾。这意味着r'py\B'匹配'python','py3','py2'但不是'py','py.',或者'py!' \B是仅仅相反的跟\b,所以它也是一个LOCALE和UNICODE的主题设定。
\d 当这个UNICODE标记是没有指定时,匹配任何十进制数字;这是等价的对于集合[0-9]。伴随UNICODE,它将匹配任何是被指代为十进制数字在Unicode字符的属性数据库中。
\D 跟上面这个想反
\s 当这个UNICODE标记不是指定的时候,它匹配任何空白字符,这是等价的对于集合[\t\n\r\f\v].这种LOCALE标记没有额外的影响在匹配空白。如果UNICODE是一个集合,这将匹配字符集[\t\n\r\f\v] 无论分类在Unicoide字符中被作为空白的。
\S 跟上面这个相反
\w 当LOCALE和UNICODE标记是没有指定时,匹配任何字母数字字符和下划线,这是等价的对于集合[a-z A-Z 0-9].伴随LOCALE,它将匹配集合[0-9_]加上无论任何字符被定义成字母数字的。如果UNICODE是一个集合,这将匹配字符[0-9]加上无论什么被定义成字母数字的在Unicode字符属性数据库中。
\W跟上面相反
\Z 匹配仅仅在字符的末尾。如果都是LOCALE和UNICODE标记是被包含在特殊的序列中,LOCALE标记首先发挥作用比UNICODE。大部分标准的省略支持用python字符序列是也被接受正则表达式解析、
\a \b \f \n
\n \t \v \x
\\
注意\b是用来表示单词边界的,意味着回车仅仅在字符串类中。
八进制省略是被包括在限制性的形势中:如果第一个数字是一个0,那么试过这里有三个八进制数字,它是被考虑成一个八进制逃跑。否则,它是一个组引用。作为一个字符串序列,八进制转义总是最多三位长度。