设为首页 收藏本站
查看: 1401|回复: 0

[经验分享] python正则一些简单匹配

[复制链接]
发表于 2018-8-10 07:29:03 | 显示全部楼层 |阅读模式
  元字符的使用
  re.findall(regex,string)
  功能:在string字符串中,匹配regex正则表达式能够匹配的项,放到一个列表中返回
  * 普通字符串
  元字符 :abc
  匹配规则 : 匹配字符串的值
  匹配示例 :abc
  In [3]: re.findall('abc','abcdeabc')
  Out[3]: ['abc', 'abc']
  * 使用“或”进行多个匹配
  元字符: re1 | re2
  匹配规则:既能匹配正则表达式re1所表达内容,也能匹配           re2所表达内容
  匹配示例:ab | bc  --》  ab   bc
  In [5]: re.findall('ab|de','abcdeabc')
  Out[5]: ['ab', 'de', 'ab']
  * 点号  "."
  元字符: .
  匹配规则:匹配任意一个字符
  匹配示例:f.o   ――》  foo   fao   f@o
  In [6]: re.findall('f.o','foo,f@oabfabo')
  Out[6]: ['foo', 'f@o']
  * 匹配开头子串
  元字符:  ^
  匹配规则:匹配一个字符串的开头位置
  匹配示例:^From  匹配以 From 开头的字符串起始部分
  In [9]: re.findall('^From','From China')
  Out[9]: ['From']
  In [10]: re.findall('^From','I come From China')
  Out[10]: []
  *匹配字符串的结尾
  元字符 :  $
  匹配规则 : 当一个字符串以什么结尾时使用$标记
  匹配示例 : py$ -》  匹配所有以py结尾的字符串
  In [17]: re.findall('py$','test.py')
  Out[17]: ['py']
  In [18]: re.findall('py$','python')
  Out[18]: []
  * 匹配任意0个或多个字符
  元字符 :   *
  匹配规则: 匹配前面出现的字符或正则表达式0次或者多次
  匹配示例: ab* ->   abbbbbbbb
  In [23]: re.findall('.*','askjdfh89w4234')
  Out[23]: ['askjdfh89w4234', '']
  In [24]: re.findall('.*','askjdfh89w4234sdfhhg')
  Out[24]: ['askjdfh89w4234sdfhhg', '']
  In [25]: re.findall('ab*','a')
  Out[25]: ['a']
  In [26]: re.findall('ab*','abbbb')
  Out[26]: ['abbbb']
  *  匹配任意1个或多个字符
  元字符 :   +
  匹配规则: 匹配前面出现的字符或正则表达式1次或者多次
  匹配示例: ab+ ->   abbbbbbbb
  In [28]: re.findall('ab+','abbbb')
  Out[28]: ['abbbb']
  In [29]: re.findall('ab+','a')
  Out[29]: []
  * 匹配字符 0 次或1次
  元字符 :  ?
  匹配规则:匹配前面出现的字符或正则表达式0次或1次
  匹配示例: ab? --》 a  或者  ab
  In [31]: re.findall('ab?','a')
  Out[31]: ['a']
  In [32]: re.findall('ab?','ab')
  Out[32]: ['ab']
  * 匹配前面的字符或re指定次数
  元字符 : {N}    N代表一个数字
  匹配规则:匹配前面出现的字符或正则表达式N次
  匹配示例: ab{3} --》 abbb
  In [34]: re.findall('ab{3}','abbbbbb')
  Out[34]: ['abbb']
  In [35]: re.findall('ab{3}','abb')
  Out[35]: []
  * 匹配前面的字符或re指定次数
  元字符 : {M,N}    M,N代表数字
  匹配规则:匹配前面出现的字符或正则表达式M 到 N次
  匹配示例: ab{3,8} --》 abbb  abbbbbbbb
  In [36]: re.findall('ab{3,8}','abbb')
  Out[36]: ['abbb']
  In [37]: re.findall('ab{3,8}','abbbbbbbbbbb')
  Out[37]: ['abbbbbbbb']
  * 字符集合匹配
  元字符 : [abcd]
  匹配规则: 匹配中括号中任意一个字符
  匹配示例: b[abcd]t    ->   bat  bbt  bct  bdt
  In [40]: re.findall('b[abc123]t','bat,b1tba3t')
  Out[40]: ['bat', 'b1t']
  In [41]: re.findall('[ab][cd]','acadbcbd')
  Out[41]: ['ac', 'ad', 'bc', 'bd']
  * 字符集合匹配
  元字符 : [a-zA-Z0-9] [a-z] [0-9] [a-zA-Z] [3-8]
  [b-x]
  匹配规则: 匹配中括号中任意一个区间内的字符
  匹配示例: [a-zA-Z0-9]+  匹配任意一个由字母数字组 In [43]: re.findall('[a-zA-Z0-9]+','safd1324')
  Out[43]: ['safd1324']
  In [44]: re.findall('[a-zA-Z0-9]+','adf$&^%123')
  Out[44]: ['adf', '123']
  成的非空字符串
  * 字符集合不匹配
  元字符 : [^...]   ... 表示上面两项中任意内容
  匹配规则: 匹配任意非中括号中的字符集
  匹配示例: [^aeiou]  匹配任意一个非aeiou字符
  [^a-z]  匹配任意一个非小写字母
  In [46]: re.findall('[^a-z]','abc1j2^&d')
  Out[46]: ['1', '2', '^', '&']
  In [47]: re.findall('[^aeiou]','hello world')
  Out[47]: ['h', 'l', 'l', ' ', 'w', 'r', 'l', 'd']
  * 匹配(非)数字字符
  元字符 : \d  [0-9]   \D [^0-9]
  匹配规则 : \d 匹配任意一个数字字符
  \D 匹配任意一个非数字字符
  匹配示例 :\d{3}  -->  '123'
  In [49]: re.findall('\d{3}','hello 1234')
  Out[49]: ['123']
  In [50]: re.findall('\D{3}','hello 1234')
  Out[50]: ['hel', 'lo ']
  * 匹配(非)字母数字字符
  元字符 : \w  [a-zA-Z0-9]   \W   [^a-zA-Z0-9]
  匹配规则 : \w 匹配任意一个字母或数字字符
  \W 匹配任意一个非字母或数字字符
  匹配示例 :\w{3}  -->  'a23'
  In [51]: re.findall('[A-Z]\w*','Hello World')
  Out[51]: ['Hello', 'World']
  In [52]: re.findall('\w+-\d+','xiaoming-56')
  Out[52]: ['xiaoming-56']
  * 匹配(非)空字符
  元字符 : \s  (空格 \n  \0  \t  \r)    \S
  匹配规则 : \s 匹配任意一个空字符
  \S 匹配任意一个非空字符
  匹配示例 :hello world  -> hello world
  In [58]: re.findall('hello\s+world','hello   world')
  Out[58]: ['hello   world']
  In [60]: re.findall('\S*','helloworld&* ask')
  Out[60]: ['helloworld&*', '', 'ask', '']
  In [61]: re.findall('\s','a b c\n')
  Out[61]: [' ', ' ', '\n']
  *匹配字符串开头和结尾
  元字符  \A  (^)  \Z ($)
  匹配规则: \A 匹配字符串的开头位置
  \Z 匹配字符串的结尾位置
  匹配示例: \Aabc\Z     ^abc$   - > abc
  In [70]: re.findall('\Aabc\Z','abcabc')
  Out[70]: []
  In [66]: re.findall('\Aabc\Z','abc')
  Out[66]: ['abc']
  In [68]: re.findall('efg\Z','hi,abcdefg')
  Out[68]: ['efg']
  * 匹配(非)单词边界
  元字符 : \b   \B
  匹配规则 : 将非字母的部分不认为是单词部分
  将连续字母的部分认为是一个单词
  匹配示例: “This is a %test%”
  In [74]: re.findall(r'\btest\b','This is a %test%')
  Out[74]: ['test']
  In [75]: re.findall(r'\bThis\b','This is a %test%')
  Out[75]: ['This']
  In [76]: re.findall(r'\bis\b','This is a %test%')
  Out[76]: ['is']
  In [77]: re.findall(r'\Bis\b','This is a %test%')
  Out[77]: ['is']
  In [78]: re.findall(r'is\b','This is a %test%')
  Out[78]: ['is', 'is']
  元字符总结
  字符 : 匹配实际字符
  匹配单个字符:  .   []   \d  \D  \w \W  \s  \S
  匹配重复次数: *   +   ?  {}
  匹配开头结尾: ^  $  \A  \Z   \b  \B
  其他 : |    [^ ]
  raw字串和转义
  r“hello world”   ->  raw字串
  raw字串特点 : 不进行转义解析
  “hello \n world”    -> \n表示换行
  r"hello \n world"   -> \n表示两个字符
  什么时候加r
  转为raw字符串是为了防止python对字符串的转义解析,所以在正则表达式本身有“\”的时候最好加上r
  正则表达式的转义匹配
  当匹配正则表达式内的特殊字符的时候,正则表达式本身也需要进行转义,如要匹配字符串中的 *  则正则表达式应为“\*”
  特殊字符如下:
  \   *  .  ?  ()  []  {}  ""  ''
  匹配字符串中的*
  In [86]: re.findall(r'\*','* is not \\, \\ is not ?')
  Out[86]: ['*']
  In [87]: re.findall('\\*','* is not \\, \\ is not ?')
  Out[87]: ['*']
  匹配字符串中的“\”
  In [89]: re.findall('\\\\','* is not \\, \\ is not ?')
  Out[89]: ['\\', '\\']
  In [90]: re.findall(r'\\','* is not \\, \\ is not ?')
  Out[90]: ['\\', '\\']
  贪婪和非贪婪
  贪婪模式 : 不做处理的情况下,正则表达式默认是贪婪模式。即 在使用 *   +  ?  {M,N} 的时候尽可能多的向后进行匹配。
  e.g.
  ab*  可以匹配 a   ab  abbb... 那么当b足够多的时候它会尽可能多的去匹配
  In [96]: re.findall(r'ab*','abbbbbbb')
  Out[96]: ['abbbbbbb']
  非贪婪模式:尽可能少的匹配复合正则条件的内容
  贪婪模式 ---》 非贪婪模式 方法:后面加“?”
  即 *?   +?   ??  {M,N}?
  In [100]: re.findall(r'ab*?','abbbbbbb')
  Out[100]: ['a']
  In [101]: re.findall(r'ab+?','abbbbbbb')
  Out[101]: ['ab']
  In [102]: re.findall(r'ab??','abbbbbbb')
  Out[102]: ['a']
  In [103]: re.findall(r'ab{2,4}?','abbbbbbb')
  Out[103]: ['abb']
  正则表达式分组
  ((ab)*(cd))
  正则表达式 (ab)*cd
  1. 正则表达式可以分组,分组的标志即括号(),每个括号都是正则表达式的一个子组,而每个子组是整体正则表达式的一部分,同时也是一个小的正则表达式
  2. 当有多个子组的时候,我们从外层向内侧分别叫第一,第二....子组。当同一层次的时候,从左向右分别计数
  3. 分组会该表* + ? {}  的重复行为,即把每个分组当做一个整体对待,进行相应的重复操作
  4. 当子组能后和多个目标字符串内容进行匹配时,只返回一个内容
  In [113]: re.findall(r'(ab)+cd','ababcdef')
  Out[113]: ['ab']
  5.每个组都可以起名字,我们可以根据起的名字辨别各个组。
  格式: (?P<word>hello)
  给子组(hello) 起一个名字,这个名字是 “word”
  子组通过名字进行调用 (?P=word)  表示复制子组正则表达式内容
  In [123]: re.findall(r'((?P<word>hello)\s+(?P=word))','hello hello')
  Out[123]: [('hello hello', 'hello')]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549362-1-1.html 上篇帖子: ElasticSearch的API python调用 下篇帖子: Python基础知识两部曲:二
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表