正则表达式能够把你想要的字符从一段字符串抓出来。那它是如何做到的呢?
1.要有一个匹配的字符。就是如果你想要a,你就写a,想要b,就写b。比如从‘abcdefg’里抓‘cde’,那么正则表达式就是‘cde’。简单吧。
但是,如果你想要的不是个明确的,比如从‘abcd1234xyz’里面抓数字,可以使用表达匹配数字的字符\d。@H_404_6@
如下是匹配各种字符的正则表达式:
\d 匹配任何十进制数;它相当于类 [0-9]。@H_404_6@
\D 匹配任何非数字字符;它相当于类 [^0-9]。@H_404_6@
\s 匹配任何空白字符;它相当于类 [ fv]。@H_404_6@
\S 匹配任何非空白字符;它相当于类 [^ fv]。@H_404_6@
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。@H_404_6@
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。@H_404_6@
@H_404_6@
.表示任意字符@H_404_6@
[]用来匹配一个指定的字符类别,所谓的字符类@H_404_6@别就是你想匹配的一个字符集,对于字符集中的字符可以理解成或的关系。@H_404_6@
^ 如果放在字符串的开头,则表示取非的意思。[^5]表示除了5之外的其他字符。而如果^不在字符串的开头,则表示它本身。@H_404_6@
元字符[^].@H_404_6@
@H_404_6@
2 有时候正则表达式为‘aaaaa‘还可以写出来,但是可能是‘aaaaa‘或是‘aaa’,怎么办呢?那就需要重复功能的元字符了。
正则表达式的元字符有@H_404_6@. ^ $ * ? { [ ] | ( )。@H_404_6@各种意义下面讲,
* 对于前一个字符重复0到无穷次@H_404_6@
+对于前一个字符重复1到无穷次@H_404_6@
?对于前一个字符重复0到1次@H_404_6@
{m,n} 对于前一个字符重复次数在为m到n次,其中@H_404_6@,{0,} = *,{1,} =,{0,1} = ?@H_404_6@
{m} 对于前一个字符重复m次@H_404_6@
@H_404_6@
3。下面讲讲没有提到的元字符。不愿意自己写了,copy一下,其实很好理解
3. 元字符(\),元字符backslash。做为 Python 中的字符串字母,反斜杠后面可以加不同的字符以表示不同特殊意义。
它也可以用于取消所有的元字符,这样你就可以在模式中匹配它们了。例如,如果你需要匹配字符 "[" 或 "\",你可以在它们之前用反斜杠来取消它们的特殊意义: \[ 或 \\
4。元字符($)匹配字符串的结尾或者字符串结尾的换行之前。(在MULTILINE模式下,"$"也匹配换行之前)
正则表达式"foo"既匹配"foo"又匹配"foobar",而"foo$"仅仅匹配"foo".
>>> re.findall("foo.$","foo1\nfoo2\n")#匹配字符串的结尾的换行符之前。
['foo2']
['foo1','foo2'] >>> m=re.search("foo.$","foo1\nfoo2\n")
>>> m
<_sre.SRE_Match object at 0x00A27170>
>>> m.group()
'foo2'
'foo1'
看来re.MULTILINE对$的影响还是蛮大的。
5.元字符(*),匹配0个或多个
6.元字符(?),匹配一个或者0个
7.元字符(+),匹配一个或者多个
8,元字符(|),表示"或",如A|B,其中A,B为正则表达式,表示匹配A或者B
9.元字符({})
{m},用来表示前面正则表达式的m次copy,如"a{5}",表示匹配5个”a”,即"aaaaa" >>> re.findall("a{5}","aaaaaaaaaa")
['aaaaa','aaaaa']
['aaaaa']
{m.n}用来表示前面正则表达式的m到n次copy,尝试匹配尽可能多的copy。
>>> re.findall("a{2,4}","aaaaaaaa") ['aaaa','aaaa']
通过上面的例子,可以看到{m,n},正则表达式优先匹配n,而不是m,因为结果不是["aa","aa","aa"]
>>> re.findall("a{2}",207)"> ['aa','aa','aa']
{m,n}? 用来表示前面正则表达式的m到n次copy,尝试匹配尽可能少的copy >>> re.findall("a{2,4}?",207)">
10。元字符( "( )" ),用来表示一个group的开始和结束。
比较常用的有(REs),(?P<name>REs),这是无名称的组和有名称的group,有名称的group,可以通过matchObject.group(name) 获取匹配的group,而无名称的group可以通过从1开始的group序号来获取匹配的组,如matchObject.group(1)。具体应用将在下面的group()方法中举例讲解