规则:匹配到就会结束:
+ 匹配此表达式 一次或多次;
字符:
{n} 匹配前面字符串的个数
{n,} 至少n个
{n,m}n- m个
{^xy} 补集 不含 xy
\d 0-9的数字:
\D 补集 非数字;
\w 大小写字母数字 下划线;
\W 补集
\b 单词的开始或结束;
一.正则表达式
1.匹配符
1)头匹配符"":如0754,只匹配开头为0754的字符串
2)尾匹配符",只匹配结尾为0754的字符串
3)全字匹配:将^和,匹配0754字符串
2.转义字符
1)空字符:
换行\n
回车\r
制表符\t
2)其他字符:
“$” $
“^” ^
“+” +
“/” /
3.通配符
1)号:用来匹配前面一个字符是否在字符串中出现零次或多次.
例1:'abc’,匹配含有ab的所有字符串。
2)+号:…一次或多次.
例2:‘abc+’,匹配含有abc的所有字符串。
3)?号:…零次或一次.
例3:只匹配含有ab、abc结尾不再含c的字符串。如abca,aabc,aaab都可以,但abcc就不行。
4.关于转义字符$与双、单引号(php4环境)
1)正则表达式本身就是一个字符串。
2)当引号中含有在内)都原封不动的赋值给字符串变量。
(2)使用双引号定义时,解释器会把引号内"“为止。
(3)注意:单个KaTeX parse error: Undefined control sequence: \, at position 47: …将其翻译成变量。也不需要加转义\̲,̲当然不提倡。
…,就无法用双引号来定义这个正则表达式,原因是转义字符$在单,双引号中表示的意义不同:
<1>双引号中,$和单个的$意义是一样的,都是代表尾匹配符,因此c$$=c$=c$$=c$=c$$;双引号中,$在任何时刻都只代表一个字符”$",echo “c$$,并且$和单个的是指该"的,也正是这个原因,大多数需要匹配$时定义正则表达式只能用’’。
<2>单引号中,$的意义仅仅表示字符”,不管后面是否有合法变量名字符;单引号中,$其实是两个字符,如不用于正则匹配将没有任何意义,echo 'c$$'结果仍是c$$。单作为正则表达式来使用,单引号中的$表示的是特殊字符"字符。
3)正则表达式的尾匹配符":$pattern="^ab$";转义字符$在双引号中就表示字符。
例2:如上题,使用";显然是错误的,但是由于结尾的正则表达式:$pattern='c$pattern=“c$$”;正则表达式将$视为尾匹配符,故只匹配以c结尾。
5."[]“方括号(字符簇)用法
1)[]匹配一个字符,在[]中使用^开头表示取非,即其后的字符全部是不匹配的。
例1:[a-zA-Z0-9]匹配所有大小写字母和数字。
例2:[\n\t\r\f]匹配所有空字符。
例3:[^A-Z]不匹配大写字母。
例4:[0-9]匹配不以数字开头的字符或字符串
2)特殊字符”."(句点)匹配除了"新行"之外的所有字符,模式^.abc’;匹配所有尾部含有abc的字符串,不匹配小数(新行),当不匹配abc。
例2:’.’;匹配所有字符串,但不匹配空值。
例3:’.abc’;匹配所有含abc的字符串,小数等等都可以,前提是不以abc为首,不匹配abc。
例4:’.abc;匹配aaaaaaaaaa。
例2:[0-9]{1,}pattern=’([1-9]{1}[0-9]{3})-([0-1]{1}[1-2]{1})-([0-3]{1}([0-9]|))’?)扩住的就是一个个子模式,()相当于把他们独立起来,分别匹配而相互不干扰。
二.POSIX风格正则表达式函数
1.ereg
ereg(pattern,string,[array $regs]);
eregi(pattern,string,[array regs,那找到的文本将放在regs[1]中存放了第一个子模式所匹配的结果,regs数组的值不会被改变。
注意:如果找到了匹配的文本,不管找到的子模式是多少个>9还是<9,ereg()只会改变regs数组被填满10个元素或者所有子模式被匹配完,如果子模式少于10则剩余的regs归regs只有10个值。
eregi()函数与ereg()基本用法相同,只是eregi对大小写不敏感。
2.ereg_replace和eregi_replace
ereg_replace(pattern,string replacement,string)
eregi_replace(pattern,string replacement,string)
string字串中满足pattern的文本将被替换成replacement。如果string中有pattern匹配的文本,那么返回替换之后的值,如果没有,则返回原来的string值。
如果pattern中包含子模式,子模式可以有选择的被保留而不被替换。
例1:pattern中的第二个子模式不被替换,replacement可写成这样:replacement\2。这样string中匹配的pattern的字符串将被替换为replacement+pattern2,pattern2表示匹配pattern的文本中又匹配pattern的第二个子模式的文本。如果使用"\0"表示保留整个匹配文本。利用这个特性可以实现在特定的字符串之后插入文本的操作。
replacement必须是字符串类型变量,如果不是,替换时将强制转换成字符串类型。
3.split()函数和spliti()函数用法
split(pattern,string,[int limit]);
spliti(pattern,string,[int limit]);
split以正则表达式pattern定义的模式为分隔符将string分隔成几个部分。如果分隔成功,返回的值为各个分隔后部分组成的数组,失败则返回false。可选limit表示最大分割块数。如果limit为5,那么即使string有>5个的地方符合pattern,string也只被分割为5个部分,最后一个部分是string去掉前四个部分后剩下的部分。返回值中也只有5个元素。
三.perl风格正则表达式及相关函数
1.perl正则语法
perl分隔符,可使用"/","!“和”{}"。
例1:/[0-9]/ !1! {2}三个都一样。
在分隔符内部,分隔字符本身就是一个特殊敏感字符,要进行转义。如果用分隔符"/",正则中又用了表达字符的"/",则必须要用"/"。如果混合用"/“和”!“就没问题。
例2:///! 两者也相同
例3:!^!![0-9]/ 两者也相同
2.perl特殊意义字符
\a ASCII值为7的告警符
\b 词的边界
\A 和脱出符号(”/")等价
\B 非词边界
\cn 控制字符
\d 单个数字
\D 单个非数字
\s 单个空白
\S 单个非空白
\w 单个的字母或下划线
\W 单个的非词字符(不是字母也不是下划线)
\Z 从目标字串的尾部开始匹配
3.高级特性
1)或运算"|":
例如!ex|em!匹配条件是ex或em开头的字符串,还可以写成!e(x|m)!。
注意:()内的内容代表子模式
2)逻辑符号后面的模式选项
!正则表达式!逻辑选项
A:只匹配位于目标字串开头的字符。
E:该选项使转义字符","^“等字符会匹配每个换行符。
s:该选项使句点”.“也匹配换行符。
x:该选项通知PHP解释器在分析的时候忽略正则表达式定义中的非转义空格符。这样可以在正则表达式中使用空格来增强其可读性,但这时在表达式中使用空格符必须使用转义字符。
3)扩展模式符号。
(?#comment) 添加注释comment,可以增强正则可读性。
(?=pattern) 指定在模式之后必须跟随值pattern。
(?!pattern) 指定在模式之后不能跟随值pattern。
(?n) 在模式内部而非结尾处定义模式选项n。
(?: ) 消耗字符,不捕获匹配结果。
例:echo ereg(”?:^a$",“a”);//无任何输出。
4.per正则函数
1.preg_grep函数
preg_grep(pattern,array input);
输入数组input中寻找匹配模式pattern的字串,并将所有的匹配字符串返回。返回值就是所有匹配的字符串组成的数组。
2.preg_match函数
preg_match(pattern,string subject,[array matches])
该函数在subject字符串中寻找匹配pattern的字符串。如果找到则返回一个非零值,否则返回零值。如果选用了可选项matches,那么匹配的字符串将被放到第一个元素的位置,可以用matches[1],第二个是$matches[2],依次类推。
3.preg_match_all函数
preg_match_all(pattern,subject,array matches,[int order])
该函数在subject字符串中寻找匹配pattern的互不重叠的文本,找到了匹配的文本则返回匹配文本的个数,否则返回0。匹配文本被放在二维数组matches中,matches[0]中存放的是所有符合的字符串。各种嵌入的子模式匹配的结果依次放在数组matches[1]~[n]中。
order参数可选,可取的值为PREG_PATTERN_ORDER和PREG_SET_ORDER。
4.preg_replace函数
preg_replace(pattern,replacement,subject,[int limit])
该函数将subject中符合pattern模式的部分替换成replacement,返回值类型和subject类型一样,如果有替换,则返回替换后的值,反之则返回原来的值。
参数可以是数组也可以是变量,有几种情况:
<1>如果subject参数是数组类型。函数对每一个数组元素进行替换操作;
<2>如果pattern是数组则函数根据每一个pattern中的类型进行替换;
<3>如果pattern和replacement都是数组,则按两个数组中的元素对应完成替换;
<4>如果replacement中的元素个数少于pattern中的元素个数。那么不够的部分将有空字符串来代替。
5.preg_split函数
preg_split(pattern,subject,[int limit][flages])
该函数以pattern定义的模式为分隔符将subject字符串分隔为若干个部分,返回数组,其中存放被分隔后的字符串。limit可限制返回字符串的数目,如果设置为-1表示对返回的字符串数目不加任何限制。flags也是可选项,其有两个值:PREG_SPLIT_NO_EMPTY设定函数不返回空字符串,PERG_SPLIT_DELIM_CAPTURE,该选项设定pattern中的嵌入子模式也会被函数匹配。
Python 正则:
HTML
<a href="/films/1203" title=“霸王别姬” class=“image-link”
正则表达式:
pattern=re.compile(
匹配以
"
匹配以board-index一次或多次
board-index.*?
匹配 数字 0-9 一次或多次加
(\d*).*?
(下面基本一样)
data-src="(.?)".?
class=“name”.?
title="(.?)".?
class=“star”>(.?)
正则表达式:
pattern=re.compile("<dd>.*?board-index.*?
(\d*)</i>.*?data-
src="(.*?)".*?
class="name".*?
title="(.*?)".*?class="star">(.*?)
</p>.*?releasetime">(.*?)
</p>.*?class="integer">(.*?)
</i>.*?fraction">(\d)
</i>.*?</dd>",re.S)
re.compile() 函数
编译正则表达式模式,返回一个对象。可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率。
re.compile(pattern, flags=0)
pattern 指定编译时的表达式字符串
flags 编译标志位,用来修改正则表达式的匹配方式。支持 re.L|re.M 同时匹配
flags 标志位参数
re.I(re.IGNORECASE)
使匹配对大小写不敏感
re.L(re.LOCAL)
做本地化识别(locale-aware)匹配
re.M(re.MULTILINE)
多行匹配,影响 ^ 和 $
re.S(re.DOTALL)
使 . 匹配包括换行在内的所有字符
re.U(re.UNICODE)
根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X(re.VERBOSE)
该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。
报错信息:
<可深入追问>
7. 正则表达式(语言操作)
文本信息:
问:什么是正则表达式?为什么报错了?正则表达式原本是想要提取什么
现在解答一下:
你就这样 每次复制一点点进去 ,现在没报错正常打印,看复制到哪一句报错就是哪部分的原因。
代码给你
import re
content = 'Citizen wang , always fall in love with neighbour,WANG'
rr = re.compile("<dd>.*?board-index.*? ",re.S) # 不区分大小写
print(type(rr))
a = rr.findall(content)
print(type(a))
print(a)