Python正则

暂时先写到这里,随使用逐步更新此文,希望我的总结能帮到你

Regular Expression Syntax

**' . ' **在默认模式下,匹配除换行符以外的任意字符。如果指定 DOTALL 标志,将匹配任何字符,包括换行符。

' ^ ' 匹配字符串的起始,并且在MULTILINE 模式下 也匹配多行的起始位置。

' $ ' 匹配字符串的末尾,或者新的一行前字符的末尾。在 MULTLINE 模式下将匹配多行的末尾位置。'foo' 匹配 'foo''foobar',然而正则表达式'foo$' 仅匹配' foo' 。更有趣的是,search for 'foo.$''foo1\nfoo2\n' 自然匹配'foo2',在MULTILINE模式下'foo1'会被匹配;在'foo\b'中寻找单一'$'将会返回两个 空(empty)匹配:一个在新的一行之前,一个在字符串的结尾。

' * ' 使该符号前面的正则表达式匹配0次或多次,尽可能更多的匹配。'ab*' 将会匹配 'a','ab'或者'a'跟随着任意数量的'b'

' + ' 使得该符号前面的正则表达式匹配1次或多次,'ab+' 将会匹配 'a'跟随着任意非零数量的'b',不会仅仅匹配一个'a'

' ? ' 使得该符号前面的正则表达式匹配1次或0次,'ab?' 将会匹配 'a'或'ab'

*?, +? , ?? 符号* ',' + ',' ? '是贪婪匹配,他们尽可能更多的匹配字符。有时我们不需要这样的性质,如果 RE <.****>匹配 <a> b <c>,它将会匹配整个字符串,而不是<a>。在这几个符号后面加上?使他进行非贪婪模式匹配或者最小匹配,尽可能少的字符将会被匹配。使用RE <.*?>将会仅仅匹配<a>

{m} 前面的正则表达式重复m次形成的表达式将会被匹配,少于正则次数的将不会被匹配,例如a{6}将会仅匹配 6 个 'a'字符,而不是5个'a'

{m,n} 符合前面正则表达式重复m到n次形成的表达式将会被匹配,尽可能的匹配更多的前面的正则。这个表达式还有非贪婪的版本。例如 'aaaaaa' 'a{3,5}'将会匹配5个'a' ,但是' a{3,5}? '将会仅匹配3个'a'。{m,n}仅会使最近的正则表达式重复m-n次,例如 ab{m,n},只会使b重复m-n次,如果你希望重复的RE表达更长,可以将前面需要重复的部分加上括号(ab){m,n},这样ab将重复m-n次。

' \ ' 转译你希望匹配的特殊字符,例如你希望匹配 ' * ' , ' ? ' 等字符。

'[ ]' 使用这个指明一组字符集合

  • 这以直接列出字符,例如 [amk] 将会匹配 ' a ',' m ',' k '
  • 在两个字符中添加' - '字符将两个字符分开,表明字符的范围。列如[a-z]将会匹配所有的小谢字母,[0-5][0-9]将会匹配所有的两位的数字从00到59,并且[0-9A-Fa-f]将会匹配任何16进制数
  • 在集合中特殊字符失去了他们的特殊意义。例如:[(+*)] 将匹配任何字符 ' ( ' , ' + ' , ' * ' , ' ) '
  • 在集合中字符类也被例如\w或者\s 也会被接受,尽管他们匹配的含义取决于 LOCALE或者UNICODE 模式被设置。
  • 如果集合中地一个字符被设置为' ^ '所有不在集合中的字符将会被匹配。
    NOTE:如果你需要匹配 [或者]以及相似的在re表达式中有特殊含义的字符,匹配[可以使用\转义字符,当你需要匹配]时,不需要转义。

' | ' A|B,A或者B可以是任意RE正则,这个正则将会匹配A或者B ,在 RE 表达式中匹配顺序按照从左到右。一旦冲共匹配则跳过右边的表达式。如果

** '(...)'** 匹配封闭括号中的正则表达式,并保存为分组。分组组的内容在匹配后可以被重新使用。

\number引用编号为number分组中匹配到的字符串,分组号从1开始。

import re
pattern = re.compile(r'(\w+) (\w+)')
s = 'i say, hello world!'
print re.sub(pattern,r'\2 \1',s)
###out###
say i, world hello!

\A 匹配字符串的起始位置

a = re.findall(r'\Athis' , 'this is a this string ,have lots of this')
a = re.findall('this' , 'this is a this string,have lots of this')
###out###
a = ['this']
a = ['this','this','this']

\Z 匹配字符串的结尾位置,例子参考上面' \A '的示例

\b 匹配\w 和\W之间,官方的解释是(Match the empty string,but only at the beginning or end of a word)我觉得就是匹配 非\w

re.search(r'foo\b','foo')   
re.search(r'foo\b','foo.')
re.search(r'foo\b','foo)')
re.search(r'foo\b','foo)))))')
###all match###

\B 与\b恰好相反

\d 当未设置UNICODE标志,匹配任意的十进制数,与[0-9]的效果相同,当UNICODE标志设置时,匹配UNICODE中的所有标记为数字的字符。

\D\d恰好相反

\s 当设置UNICODE标志,匹配任意的空白字符(whitespace character),与[\t\n\r\f\v]的效果相同。LOCALE标志不会扩展机器中的空白字符。当UNICODE标志设置时,匹配所有UNICODE字符集中的所有空白字符

\S\s恰好相反

\w 当设置LOCALEUNICODE标志,匹配所有的字母数字以及下划线,与[a-zA-Z0-9_]效果相同

\W\w恰好相反

Module Contents

re.compile(pattern,flags=0)
编译正则表达式为正则表达式对象,可以在re.match()和re.search方法中使用。

result = prog.match(string)```
和这样的用法相同
```result = re.match(pattern,string)```
然而使用re.compile() 并且将结果保存在正则表达式对象中,当这个表达式在同一程序中被多次使用时效果更明显。
>**```re.DEBUG```** 
显示关于编译表达式的debug信息
***
**```re.I
re.IGNORECASE```**
执行不区分大小写匹配
***
**```re.M
re.MULTILINE```**
当被指定后,模式字符```' ^ '```匹配字符串的起始和每行的起始。模式字符```' $ '```匹配字符串的末尾和每行的末尾。
***
**```re.S
re.DOTALL```**
使```' . '```匹配任意字符,包括换行符
***
**```re.U
re.UNICODE```**
使\w,\W,\b,\B,\d,\D,\s,\S依赖于Unicode 字符属性库
***
>**```re.search(pattern,string,flags = 0)```**
扫描整个字符串,寻找正则表达式第一个匹配的位置。把相应的```MathObject```实例返回.如果没有任何位置匹配返回```None```.

>**```re.match(pattern,string,flags = 0)```**
如果 0 或者更多的字符在字符串的起始位置匹配正则表达式,返回一个相应的```MathObject```实例。如果没有匹配返回```None```。
NOTE:即使在```MULTILINE```模式下,```re.match```也只会匹配字符串的起始位置,而不是每一行的起始位置。

>**```re.splite(pattern,string,maxsplit = 0 , flags = 0)```**
依照匹配模式拆分字符串,如果在模式匹配中使用捕获括号,在模式组中的所有文本也成为返回结果列表的一部分。如果设置maxsplit不为0,那么最多分割maxsplite次。
```>>>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.']```
````>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)```
```['0', '3', '9']```

>**```re.findall(pattern,string,flags = 0)```**
返回字符串中的模式串的所有的非重叠匹配,返回一个字符列表。从左至右扫描字符串,匹配结果按照查找顺序返回。如果一个或者多个group在匹配模式中,返回一个group列表。如果匹配模式中包含超过一个group 将返回一个包含元组的列表

>**```re.finditer(pattern,string,flags=0)```**
搜索string,返回一个顺序访问每一个匹配结果的迭代器,从左向右扫描字符串,按照匹配顺序返回匹配结果。

>**```re.sub(pattern,repl,string,count = 0,flags = 0)```**
使用repl 替换string中每一个匹配的字符后,返回替换后的字符串。repl可以是一个字符传或者函数,当repl是一个字符串时,可以使用\id \g引用分组,但编号要从1起始。当repl是一个方法时,该方法接受一个(Match对象),返回用于替代的字符串。

>**```re.subn(pattern,repl,string[,count])```**
与re.sub方法类似,不过可以通过设置count,设置替换次数。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容