python的正则表达式re模块的常用方法【美高梅48

作者:编程技术

 

2、非打印字符:字符 含义cx 匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。f 匹配一个换页符。等价于 x0c 和 cL。n 匹配一个换行符。等价于 x0a 和 cJ。r 匹配一个回车符。等价于 x0d 和 cM。s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。S 匹配任何非空白字符。等价于 [^ fnrtv]。t 匹配一个制表符。等价于 x09 和 cI。v 匹配一个垂直制表符。等价于 x0b 和 cK。

subn
re.subn(pattern, repl, string[, count, flags])
subn(repl, string[, count=0])

 6. 分组优先显示

可以使用字符类指定字符列表以匹配正则表达式中的一个位置。使用方括号定义字符类。例如,下面的正则表达式定义了匹配 bag、beg、big、bog 或 bug 的字符类: /b[aeiou]g/1、字符类中的转义序列: 通常在正则表达式中具有特殊含义的大多数元字符和元序列在字符类中“不具有”那些特殊含义。例如,在正则表达式中星号用于表示重复,但是出现在字符类中时则不具有此含义。下列字符类匹配星号本身以及列出的任何其它字符: /[abc*123]/ 但是,下表中列出的三个字符功能与元字符相同,在字符类中具有特殊含义:

3.re的主要功能函数

 

模式修正符 -- 解说正则表达式模式中使用的修正符说明 下面列出了当前在 PCRE 中可能使用的修正符。括号中是这些修正符的内部 PCRE 名。修正符中的空格和换行被忽略,其它字符会导致错误。

sub
re.sub(pattern, repl, string[, count, flags])
sub(repl, string[, count=0])
说明:在字符串 string 中找到匹配正则表达式 pattern 的所有子串,用另一个字符串 repl 进行替换。如果没有找到匹配 pattern 的串,则返回未被修改的 string。Repl 既可以是字符串也可以是一个函数。
例:

  美高梅4858官方网站 1

m 默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的。“行起始”元字符仅仅匹配字符串的起始,“行结束”元字符仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面。这和 Perl 是一样的。

finditer
re.finditer(pattern, string[, flags])
finditer(string[, pos[, endpos]])
说明:和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并组成一个迭代器返回。同样 RegexObject 有:

  split

元字符与“[]”相关:

例:设置flag

 

POSIX兼容正则:[:upper:]:匹配所有的大写字母[:lower:]:匹配所有的小写字母[:alpha:]:匹配所有的字母[:alnum:]:匹配所有的字母和数字[:digit:]:匹配所有的数字[:xdigit:]:匹配所有的十六进制字符,等价于[0-9A-Fa-f][:punct:]:匹配所有的标点符号,等价于 [.,"'?!;:][:blank:]:匹配空格和TAB,等价于[ /t][:space:]:匹配所有的空白字符,等价于[ /t/n/r/f/v][:cntrl:]:匹配所有ASCII 0到31之间的控制符。[:graph:]:匹配所有的可打印字符,等价于:[^ /t/n/r/f/v][:print:]:匹配所有的可打印字符和空格,等价于:[^/t/n/r/f/v][.c.]:功能不明[=c=]:功能不明[:<:>:]:匹配单词的结尾

复制代码 代码如下:

  findall 

正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表达式代码的难度较大,学习起来也不是很容易,所以需要付出一些努力才行,入门之后参照一定的参考,使用起来还是比较简单有效的。

语法 意义 说明
"." 任意字符
"^" 字符串开始 '^hello'匹配'helloworld'而不匹配'aaaahellobbb'
"$" 字符串结尾 与上同理
"*" 
0 个或多个字符(贪婪匹配)
<*>匹配<title>chinaunix</title>
" "
1 个或多个字符(贪婪匹配)
与上同理
"?"
0 个或多个字符(贪婪匹配)
与上同理
*?, ?,??
以上三个取第一个匹配结果(非贪婪匹配) <*>匹配<title>
{m,n}
对于前一个字符重复m到n次,{m}亦可
a{6}匹配6个a、a{2,4}匹配2到4个a
{m,n}?
对于前一个字符重复m到n次,并取尽可能少
‘aaaaaa'中a{2,4}只会匹配2个
"\"
特殊字符转义或者特殊序列
[]
表示一个字符集 [0-9]、[a-z]、[A-Z]、[^0]
"|"
A|B,或运算
(...)
匹配括号中任意表达式
(?#...)
注释,可忽略
(?=...)
Matches if ... matches next, but doesn't consume the string.
'(?=test)'  在hellotest中匹配hello
(?!...)
Matches if ... doesn't match next.
'(?!=test)'  若hello后面不为test,匹配hello
(?<=...) 
Matches if preceded by ... (must be fixed length).
'(?<=hello)test'  在hellotest中匹配test
(?<!...)
Matches if not preceded by ... (must be fixed length).
'(?<!hello)test'  在hellotest中不匹配test

  random.choice(num)  随机抽取列表中一个值

s 如果设定了此修正符,模式中的圆点元字符匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。

正则表达式特殊序列表如下:

  search : re.search('正则表达式','字符串') 

同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式:

复制代码 代码如下:

 索引方法使用分组

7.3 确定重复出现到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号用来确定前面的内容的重复出现的次数。

特殊序列符号
意义
A
只在字符串开始进行匹配
Z
只在字符串结尾进行匹配
b
匹配位于开始或结尾的空字符串
B
匹配不位于开始或结尾的空字符串
d
相当于[0-9]
D
相当于[^0-9]
s
匹配任意空白字符:[tnrrv]
S
匹配任意非空白字符:[^tnrrv]
w
匹配任意数字和字母:[a-zA-Z0-9]
W
匹配任意非数字和字母:[^a-zA-Z0-9]
ret = re.subn('d ','H','123qwedf',1)
print(ret)
#结果 ('Hqwerdf' , 1)    给出替换结果和替换的次数

只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式

复制代码 代码如下:

 

PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误):

复制代码 代码如下:

  必须先定义分组才能使用分组

e 如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

复制代码 代码如下:

      美高梅4858官方网站 2

用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,b描述单词的前或后边界,B表示非单词边界。不能对定位符使用限定符。3.2 字符类[ ]

if re.search(r'abc','helloaaabcdworldn'):
    print 'search succeeds'
else:
    print 'search fails'

ret = re.finditer('d','123qwerdf')    #拿到一个生成器
for i in ret     #拿到正则表达式对象
    print(i.group())

i 如果设定此修正符,模式中的字符将同时匹配大小写字母。

findall
re.findall(pattern, string[, flags])
findall(string[, pos[, endpos]])
作用:在字符串中找到正则表达式所匹配的所有子串,并组成一个列表返回
例:查找[]包括的内容(贪婪和非贪婪查找)

  num = [1,2,3,'qwe',('hehe','haha')]

例如: / / 可以匹配very googd或者very very good

结果如下:
['192', '168', '1', '1']
['192', '.', '168', '.', '1', '.', '1']
['192', '.', '168.1.1']

 4. compile  (提高时间效率)

^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串 ^[0-9]{1,}$ //所有的正数 ^-{0,1}[0-9]{1,}$ //所有的整数 ^-{0,1}[0-9]{0,}.{0,1}[0-9]{0,}$ //所有的小数

复制代码 代码如下:

  random.randint(1,8)  [1,8] 包含8在内的范围内随机取整数

是匹配的。

match
re.match(pattern, string[, flags])
match(string[, pos[, endpos]])
作用:match() 函数只在字符串的开始位置尝试匹配正则表达式,也就是只报告从位置 0 开始的匹配情况,而 search() 函数是扫描整个字符串来查找匹配。如果想要搜索整个字符串来寻找匹配,应当用 search()。

 2. 随机抽取

特殊字符"?"与{0,1}是相等的,它们都代表着:“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为:

使用python的re模块,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相...

   subn

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或 或?或{n}或{n,}或{n,m}共6种。*、 和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。 正则表达式的限定符有: 字符 描述* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 匹配前面的子表达式一次或多次。例如,'zo ' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。 等价于 {1,}。? 匹配前面的子表达式零次或一次。例如,"do?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o '。'o{0,}' 则等价于 'o*'。{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

#!/usr/bin/env python
import re
p = re.compile('(one|two|three)')
print p.sub('num', 'one word two words three words apple', 2)

一, 转译符

3. 正则表达式定义

    常用的功能函数包括:compile、search、match、split、findall(finditer)、sub(subn)
compile
re.compile(pattern[, flags])
作用:把正则表达式语法转化成正则表达式对象
flags定义包括:
re.I:忽略大小写
re.L:表示特殊字符集 w, W, b, B, s, S 依赖于当前环境
re.M:多行模式
re.S:' . '并且包括换行符在内的任意字符(注意:' . '不包括换行符)
re.U: 表示特殊字符集 w, W, b, B, d, D, s, S 依赖于 Unicode 字符属性数据库

 

U:使“?”的默认匹配成为贪婪状态的。

可以查询re模块的功能信息,下面会结合几个例子说明。

  

A 如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现。

import re
print re.__doc__

 

如果在模式中定义标准括号组,则之后可以在正则表达式中引用它。这称为“逆向引用”,并且此类型的组称为 “捕获组”。

split
re.split(pattern, string[, maxsplit=0, flags=0])
split(string[, maxsplit=0])
作用:可以将字符串匹配正则表达式的部分割开并返回一个列表
例:简单分析ip

  美高梅4858官方网站 3 

4. 各种操作符的运算优先级

#!/usr/bin/env python
import re
r1 = re.compile('W ')
print r1.split('192.168.1.1')
print re.split('(W )', '192.168.1.1')
print re.split('(W )', '192.168.1.1', 1)

      的应为 : '\\n'-->'\n '

3、反转的字符类: 如果在字符类的开头使用尖号 字符,则将反转该集合的意义,即未列出的任何字符都认为匹配。下面的字符类匹配除小写字母 或数字以外的任何字符: /[^a-z0-9]/ 必须在字符类的“开头”键入尖号 字符以表示反转。否则,您只是将尖号字符添加到字符类的字符中。例如,下面的字符类匹配许多符号字符中的任意一个,其中包括尖号: /[!.,# *%$&^]/3.3 分组和选择

#!/usr/bin/env python
import re
r1 = re.compile(r'world')
if r1.match('helloworld'):
    print 'match succeeds'
else:
    print 'match fails'
if r1.search('helloworld'):
    print 'search succeeds'
else:
    print 'search fails'

  1 表示使用第一组,匹配到的内容必须和第一个组中的内容完全相同

在该模式中的字母是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符,要用到转义序列。所有的转义序列都用反斜杠打头。制表符的转义序列是:t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:

例:直接调用

  当匹配的内容和 另一部分必须一样是可以使用分组命名

注意:这里的第7部分跟前面的内容看起来似乎有些重复,目的是把前面表格里的部分重新描述了一次,目的是让这些内容更容易理解。

下面是几个例子: 例:最基本的用法,通过re.RegexObject对象调用

 随机: 在某个范围内取到每一个值的概率是相同的

x 如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和 Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式的序列 (?( 中间。

说明:该函数的功能和 sub() 相同,但它还返回新的字符串以及替换的次数。同样 RegexObject 有:

    在正则表达式中: '\n'-->'n',但是在pycharm中 n为换行符,则需要转译 '\n',与之匹配

s:如果设定了此修正符,模式中的圆点元字符匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。

2.re的正则表达式语法
正则表达式语法表如下:

  num = [1,2,3,'qwe',('hehe','haha')]

这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:

复制代码 代码如下:

  1.python 中的转译符

u 此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。

#!/usr/bin/env python
import re
r1 = re.compile('([.*])')
print re.findall(r1, "hello[hi]heldfsdsf[iwonder]lo")
r1 = re.compile('([.*?])')
print re.findall(r1, "hello[hi]heldfsdsf[iwonder]lo")
print re.findall('[0-9]{2}',"fdskfj1323jfkdj")
print re.findall('([0-9][a-z])',"fdskfj1323jfkdj")
print re.findall('(?=www)',"afdsfwwwfkdjfsdfsdwww")
print re.findall('(?<=www)',"afdsfwwwfkdjfsdfsdwww")

  random.uniform(1,9)  任意范围内的小数

^once

说明一下:r是raw(原始)的意思。因为在表示字符串中有一些转义符,如表示回车'n'。如果要表示表需要写为'\'。但如果我就是需要表示一个'' 'n',不用r方式要写为:'\n'。但使用r方式则为r'n'这样清晰多了。

    ' n' :    表示取消了的转译

字符簇 含义 ^[a-zA-Z_]$ 所有的字母和下划线 ^[[:alpha:]]{3}$ 所有的3个字母的单词 ^a$ 字母a ^a{4}$ aaaa ^a{2,4}$ aa,aaa或aaaa ^a{1,3}$ a,aa或aaa ^a{2,}$ 包含多于两个a的字符串 ^a{2,} 如:aardvark和aaab,但apple不行 a{2,} 如:baad和aaa,但Nantucket不行 t{2} 两个制表符 .{2} 所有的两个字符

#r2 = re.compile(r'n$', re.S)
#r2 = re.compile('n$', re.S)
r2 = re.compile('World$', re.I)
if r2.search('helloworldn'):
    print 'search succeeds'
else:
    print 'search fails'

  random.randrange(1,10,2) [1,8) 不包含8在内的范围内随机取奇数整数

S 当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。

search
re.search(pattern, string[, flags])
search (string[, pos[, endpos]])
作用:在字符串中查找匹配正则表达式模式的位置,返回 MatchObject 的实例,如果没有找到匹配的位置,则返回 None。

    正则表达式中的内容在Python中就是字符串

前言

1.re的简介
使用python的re模块,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息。python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配。

 3. 切割 (split) 

非捕获组) :复制代码 代码如下: $pattern = '/./'; $str = "bob@example.com"; preg_match($pattern, $str, $match); print_r; Array( [0] => bob@example.com [1] => bob [2] => example) 一类特殊的非捕获组是 “向前查找组” ,它包括两种类型: “正向前查找组”和 “负向前查找组” 。 使用 定义正向前查找组,它指定组中的子模式位置必须匹配。但是,匹配正向前查找组的字符串部分可能匹配正则表达式中的剩余模式。例如,由于 在下列代码中是正向前查找组,它匹配的字符 e 可以被正则表达式的后续部分匹配,在本例中为捕获组 w*): 复制代码 代码如下: $pattern = '/sh/i'; $str = "Shelly sells seashells by the seashore"; preg_match($pattern, $str, $match); print_r; Array( [0] => Shelly [1] => elly)

  search

列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。

 

:定义元序列并撤销元字符的特殊含义。对于要识别为字面字符的任何字符,必须在该字符前面加反斜杠转义字符。 例如,下面的正则表达式包含匹配四个符号中任意一个符号的字符类。/[$\]-]/

 

使用 定义负向前查找组,它指定该组中的子模式位置必须不匹配。例如:

  5. finditer  (提高空间效率)  

这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符^和$同时使用时,表示精确匹配。例如:

    [ - ] 只写在字符组的首位的时候表示普通的 减号 / 负号写在其他位置表示范围

-- type="application/x-mplayer2"test,3333

 2. 替换( replace)

类似的,用n表示“新行”,r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\表示,句号.用.表示,以此类推。7.2 字符簇在INTERNET的程序中,正规表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:

re.search('d (.d )(.d )?','1.2.3-2*(60 (-40.35/5))')
print(ret.group())#全部输出/即是print(ret.group(0))

print(ret.group(1))# .2 优先输出(.d ) print(ret.group(2))# .3 
  #如果search中有分组,通过group(n)就能够拿到group中的匹配的内容

这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。

 

i :匹配时忽略大小写。

 

PERL兼容正则:/a alarm,即 BEL 字符/cx "control-x",其中 x 是任意字符/e escape/f 换页符 formfeed/n 换行符 newline/r 回车符 carriage return/xhh 十六进制代码为 hh 的字符/ddd 八进制代码为 ddd 的字符,或 backreference/d 任一十进制数字/D 任一非十进制数的字符/s 任一空白字符/S 任一非空白字符/w 任一“字”的字符/W 任一“非字”的字符/b 字分界线/B 非字分界线/A 目标的开头/Z 目标的结尾或位于结尾的换行符前/z 目标的结尾/G 目标中的第一个匹配位置

 7. 分组命名  

类型匹配:

  match : re.match('正则表达式','字符串') 

用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。 其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

  操作匹配的字符串

当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

 

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

    ' ( ' 表示匹配小括号 ; [() * ? / $ .] 在字符组中一些特殊的字符会现原形.

PERL兼容正则可以使用任何不是字母、数字或反斜线的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[] 和 <> 作为定界符

    r  表示取消本字符串的所有转译

所谓元字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个。ls *.txt。正则表达式有以下特殊字符。

 4. 打乱顺序

可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。

  random.random()  0-1之间的随机小数

正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

  random.sample(num,2) 随机抽取列表中2(多个值)值

PHP的正规表达式有一些内置的通用字符簇,列表如下:

 1. 查找 

使用POSIX兼容规则的函数有:ereg_replaceeregi_replacesql_regcasemb_ereg_replace()mb_ereg_search_getpos()mb_ereg_search_getregs()mb_ereg_search_initmb_ereg_search_regs()mb_ereg_search_setposmb_eregmb_eregimb_regex_set_options

 

匹配次数与“{}”相关:

  前后组名必须一样才能匹配成功

例如:复制代码 代码如下:

   

特殊字符"." 在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。

      如果就是想匹配减号 [1-9]

一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:

   (?P<name>正则表达式)  表示给分组起名字 ;  (?P=name) 表示使用分组

x:如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。

ret = re.match('d ','%^123qwer123df')
print(ret)
#结果 : None    #只从头开始匹配,相当于在正则表达式前添加一个 ^

逻辑区隔:

 

正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。

  random.shuffle(num)  在原列表基础上打乱顺序

特殊字符"*"与{0,}是相等的,它们都代表着“0个或多个前面的内容”。最后,字符" "与 {1,}是相等的,表示“1个或多个前面的内容”,所以上面的4个例子可以写成:

  random.randrange(1,8)  [1,8) 不包含8在内的范围内随机取整数

5、定界符:边界

  findall : re.findall('正则表达式','字符串') 

正则表达式是由普通字符以及特殊字符组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。3.1 字符

    ' n ' : 转移符赋予了这个n一个特殊意义,表示一个换行符

PHP同时使用两套正则表达式规则,一套是由电气和电子工程师协会制定的POSIX Extended 1003.2兼容正则,另一套来自PCRE(Perl Compatible Regular Expression)库提供PERL兼容正则,这是个开放源代码的软件,作者为 Philip Hazel。

   2. 正则表达式中的转义

字符簇 含义 [[:alpha:]] 任何字母 [[:digit:]] 任何数字 [[:alnum:]] 任何字母和数字 [[:space:]] 任何白字符 [[:upper:]] 任何大写字母 [[:lower:]] 任何小写字母 [[:punct:]] 任何标点符号 [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

 

此外还有:

ret =  re.findall('www.(baidu|goole).com,'www.baidu.com')
print(ret)
#结果 [] findall 会优先显示分组中的 baidu|goole 匹配内容,要想取消分
    组优先,(?:正则表达式)

由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。

 1. 随机小数

目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix,HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。

 

与字符串

ret = re.findall('d ','123qwer123df')
print(ret)  #参数  返回值类型:列表  返回值个数:1  返回值内容:所有匹配的项若没有
          匹配到就是空列表 []

X:模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。

ret = re.search('d ','123qwer123df')
print(ret)    #参数    返回值类型: 正则匹配结果的对象    返回值个数 : 1
                        如果匹配上就返回对象,没匹配上返回None
print(ret.group()) #返回的对象通过group来获取匹配到的第一个结果 

只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。

  方法: findall  search  math  替换  sub subn  切割  compile  finditer

m:当设定了此修正符,行起始除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。

 

注: 本修正符在 PHP3 中不可用。

    在Python中 : r '\n'-->r 'n'

2. 正则表达历史 正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

二, re 模块

这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:

  

bucket$

三, random模块

例子: ^. @. \.. $

ret = re.split('d ','123qwerdf')
print(ret)    #按数字切割

^[^0-9][0-9]$

ret = re.sub('d ','H','123qwedf',1)  #把'd '替换成'H',指定替换一次(不指定次数全替换)
print(ret)

模式:$pattern = '/sh/i';Array( [0] => shore [1] => ore)3.2 模式修正标志符

 3. 随机整数

从这里我们就可以看出,第一个执行结果一直匹配到最后一个满足条件的字符,专业一点就叫贪婪匹配,

ret = re.split('(d )','qwe12d34f')
print(ret)    #遇到分组会保留 被切掉的内容
#结果 ['qwe','12','d','34','f']

7.1 基本模式匹配

ret = re.compile('-0.d |-[1-9]d(.d )?')   #可以重复被利用 ,在多
                            次使用某一个相同的正则表达式的时候,compile会提高
                            程序的效率.

re = ret.search('qwe-20df-3')
print(re.group())  
#结果 -20          

在引用的时候,括号是可以嵌套的,逻辑次序是按照“(”出现的次序来标定的。

  sub

如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。

前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:

1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。

2、字符类中字符的范围: 使用连字符指定字符的范围,例如 A-Z、a-z 或 0-9。这些字符必须在字符类中构成有效的范围。例如,下面的字符类匹配 a-z 范围内的任何一个字符或任何数字:/[a-z0-9]/ 您还可以使用 xnn ASCII 字符代码通过 ASCII 值指定范围。例如,下面的字符类匹配扩展 ASCII 字符集中的任意字符 :/[x80-x9A]/

1. 引子

[^a-z] //除了小写字母以外的所有字符 [^\/^] //除了之外的所有字符 [^"'] //除了双引号之外的所有字符

定界符:

U 本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 修正符或者在数量符之后跟一个问号来启用此选项。

相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下: 操作符 描述 转义符, [] 圆括号和方括号*, , ?, {n}, {n,}, {n,m} 限定符^, $, anymetacharacter 位置和顺序| “或”操作

当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。

^[a-zA-Z0-9_] $ //所有包含一个以上的字母、数字或下划线的字符串 ^[0-9] $ //所有的正数 ^-?[0-9] $ //所有的整数 ^-?[0-9]*.?[0-9]*$ //所有的小数

u:模式字符串被当成UTF-8。

这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现x次”;一个数字加逗号,{x,}的意思是“前面的内容出现x或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现x次,但不超过y次”。我们可以把模式扩展到更多的单词或数字:

使用PERL兼容规则的函数有:preg_grep()preg_replace_callbackpreg_matchpreg_split

有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号“[]”内被识别的。

/AB*C/;元字符 说明$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 'n' 或 'r'。要匹配 $ 字符本身,请使用 $。 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 。* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。 匹配前面的子表达式一次或多次。要匹配 字符,请使用 。. 匹配除换行符 n之外的任何单字符。要匹配 .,请使用 。[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'n' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配 "("。^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。{ 标记限定符表达式的开始。要匹配 {,请使用 {。| 指明两项之间的一个选择。要匹配 |,请使用 |。

捕获组) :复制代码 代码如下: $pattern = '//'; $str = "bob@example.com"; preg_match($pattern, $str, $match); print_r; Array( [0] => bob@example.com [1] => bob [2] => example [3] => com)

X 此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。

^t

PHP正则表达式模式后面通常带有 /i, /is, /s, /isU等参数,那么这都是些什么东西呢?下面我们一起来看看:

^-?[0-9]{0,}.?[0-9]{0,}$

A:如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。

8.posix和perl标准的正则表达式区别

POSIX兼容正则和PERL兼容正则“[]之内”“一致”的元字符:/ 有数种用途的通用转义符^ 取反字符,但仅当其为第一个字符时有效- 指定字符ASCII范围,仔细研究ASCII码,你会发现[W-c]等价于[WXYZ//^_`abc]

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 'n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。 例如,在下面的正则表达式中,序列 1 匹配在捕获括号组中匹配的任意子字符串: /-by-1/; // 匹配字符串:48-by-48 可以通过键入 1, 2,..., 99 在正则表达式中指定最多 99 个此类逆向引用。

[AaEeIiOoUu]

修正符:

尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。

1、后向引用:

7. 正则表达式匹配规则

5. 全部符号解释字符 描述 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'n' 匹配一个换行符。序列 '\' 匹配 "" 而 "(" 则匹配 "("。^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 'n' 或 'r' 之后的位置。$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 'n' 或 'r' 之前的位置。* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 匹配前面的子表达式一次或多次。例如,'zo ' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。 等价于 {1,}。? 匹配前面的子表达式零次或一次。例如,"do?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o '。'o{0,}' 则等价于 'o*'。{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。? 当该字符紧跟在任何一个其他限制符 (*, , ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o ?' 将匹配单个 "o",而 'o ' 将匹配所有 'o'。. 匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符,请使用象 '[.n]' 的模式。 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ' 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 来组合一个模式的各个部分是很有用。例如, 'industr 就是一个比 'industry|industries' 更简略的表达式。 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows ' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows ' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'ood' 则匹配 "zood" 或 "food"。[xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。[^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。[a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。B 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。cx 匹配由 x 指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。d 匹配一个数字字符。等价于 [0-9]。D 匹配一个非数字字符。等价于 [^0-9]。f 匹配一个换页符。等价于 x0c 和 cL。n 匹配一个换行符。等价于 x0a 和 cJ。r 匹配一个回车符。等价于 x0d 和 cM。s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。S 匹配任何非空白字符。等价于 [^ fnrtv]。t 匹配一个制表符。等价于 x09 和 cI。v 匹配一个垂直制表符。等价于 x0b 和 cK。w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'x41' 匹配 "A"。'x041' 则等价于 'x04' & "1"。正则表达式中可以使用 ASCII 编码。.num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'1' 匹配两个连续的相同字符。n 标识一个八进制转义值或一个向后引用。如果 n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 ,则 n 为一个八进制转义值。nm 标识一个八进制转义值或一个向后引用。如果 nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 ,则 nm 将匹配八进制转义值 nm。nml 如果 n 为八进制数字 ,且 m 和 l 均为八进制数字 ,则匹配八进制转义值 nml。un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, u00A9 匹配版权符号 。

-- type="application/x-mplayer2"test,3333

要在正则表达式模式中包含元字符以使其不具有特殊含义,您必须使用反斜杠 转义字符。例如,下面的正则表达式与顺序依次为字母 A、字母 B、星号和字母 C 的模式匹配:

D:如果设定了此修正符,模式中的行结束仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面。如果设定了 m 修正符则忽略此选项。

^bucket$

最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号、跟着0个或更多的数字、和一个可选的小数点再跟上0个或多个数字,并且没有其他任何东西。下面你将知道能够使用的更为简单的方法。

POSIX兼容正则没有定界符,函数的相应参数会被认为是正则。

U: 表示PCRE_UNGREEDY,表示非贪婪,相当于perl/python语言的.*?,在匹配过程中,对于.*正则,一有匹配立即执行,而不是等.*消费了所有字符再一一回退。

6. 部分例子正则表达式 说明/b 1b/gi 一个单词连续出现的位置// 将一个URL解析为协议、域、端口及相对路径/^ [1-9][0-9]{0,1}$/ 定位章节的位置/[-a-z]/ A至z共26个字母再加一个-号。/terb/ 可匹配chapter,而不能terminal/Bapt/ 可匹配chapter,而不能aptitude/Windows/ 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。

once

[a-z] //匹配所有的小写字母 [A-Z] //匹配所有的大写字母 [a-zA-Z] //匹配所有的字母 [0-9] //匹配所有的数字 [0-9.-] //匹配所有的数字,句号和减号 [ frtn] //匹配所有的白字符

--test,3333

4、限定符:

POSIX兼容正则没有修正符。

] :定义字符类的结尾。 - :定义字符范围

^[a-z][0-9]$

逻辑区间与“包含起来的区域是一个逻辑区间,逻辑区间的主要作用是体现出一些字符出现的逻辑次序,另一个用处就是可以用来引用。后一个作用比较奇特://1",$str);// PERL兼容正则:echo preg_replace/","$1",$str);// 显示两个链接?>

POSIX兼容正则和PERL兼容正则“[]之外”“一致”的元字符:/ 有数种用途的通用转义符^ 匹配字符串的开头$ 匹配字符串的结尾? 匹配0或者1* 匹配 0 个或多个前面指定类型的字符 匹配 1 个或多个前面指定类型的字符

POSIX兼容正则和PERL兼容正则的逻辑区隔符号作用和使用方法完全一致:[]:包含任选一操作的相关信息。{}:包含匹配次数的相关信息。():包含一个逻辑区间的相关信息,可被用来进行引用操作。|:表示“或”,[ab]和a|b是等价的。

这样的代码曾经多次把我自己给吓退过。可能很多人也是被这样的代码给吓跑的吧。继续阅读本文将让你也可以自由应用这样的代码。

POSIX兼容正则和PERL兼容正则“[]之外”“不一致”的元字符:. PERL兼容正则匹配除了换行符外的任意一个字符. POSIX兼容正则匹配任意一个字符

3、元字符:

1、普通字符:

There once was a man from NewYork Who kept all of his cash in a bucket.

POSIX兼容正则和PERL兼容正则在匹配次数方面完全一致:{2}:表示匹配前面的字符2次{2,}:表示匹配前面的字符2次或多次,默认都是贪婪的匹配{2,4}:表示匹配前面的字符2次或4次

e:如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。

随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。

S:当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。

2、使用非捕获组和向前查找组: 非捕获组是只用于分组的组,它不会被“收集” ,也不会匹配有限的逆向引用。可以使用 来定义非捕获组,如下所示: /; 例如,注意在捕获组和非捕获组中加入 的区别:

POSIX兼容正则和PERL兼容正则“[]之内”“不一致”的元字符:- POSIX兼容正则中[a-c-e]的指定会抛出错误。- PERL兼容正则中[a-c-e]的指定等价于[a-e]。

第二个执行结果只匹配第一个满足条件的字符,叫 非贪婪匹配。

D 如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果 最后一个字符是换行符的话,美元符号也会匹配此字符之前。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。

本文由分分快三计划发布,转载请注明来源

关键词: 实例 脚本 详细介绍 之家