设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
楼主: crossin先生
打印 上一主题 下一主题

【Python 第56课】 正则表达式(2)

[复制链接]

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

31#
发表于 2016-2-3 22:29:27 |只看该作者
fangweiren 发表于 2016-2-3 13:39
Cross先生,为什么不能用^表示开头,$表示结尾,试了好多,输不出结果

^是表示整个字符串的开头,$是整个字符串的结尾,同时加了这两个,那除非整串完全匹配
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

32#
发表于 2016-2-3 22:33:14 |只看该作者
fangweiren 发表于 2016-2-3 13:39
Cross先生,为什么不能用^表示开头,$表示结尾,试了好多,输不出结果

^是表示整个字符串的开头,$是整个字符串的结尾,同时加了这两个,那除非整串完全匹配
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

33#
发表于 2016-2-3 22:33:57 |只看该作者
fangweiren 发表于 2016-2-3 13:39
Cross先生,为什么不能用^表示开头,$表示结尾,试了好多,输不出结果

^是表示整个字符串的开头,$是整个字符串的结尾,同时加了这两个,那除非整串完全匹配
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

34#
发表于 2016-2-3 22:34:12 |只看该作者
fangweiren 发表于 2016-2-3 13:39
Cross先生,为什么不能用^表示开头,$表示结尾,试了好多,输不出结果

^是表示整个字符串的开头,$是整个字符串的结尾,同时加了这两个,那除非整串完全匹配
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

59

积分

注册会员

Rank: 2

35#
发表于 2016-2-4 10:23:05 |只看该作者
crossin先生 发表于 2016-2-3 22:34
^是表示整个字符串的开头,$是整个字符串的结尾,同时加了这两个,那除非整串完全匹配 ...

嗯嗯,后来想通了,^$是匹配真个字符串,现在确是在一个字符串中匹配,谢谢先生
回复

使用道具 举报

0

主题

1

好友

273

积分

中级会员

Rank: 3Rank: 3

36#
发表于 2016-2-4 10:53:28 |只看该作者
crossin先生 发表于 2016-2-2 23:00
直接写'\bhi',\b就被转义了。
找\bhi的话,前面就要用r

谢谢先生,大概明白了~~
回复

使用道具 举报

0

主题

1

好友

61

积分

注册会员

Rank: 2

37#
发表于 2016-2-4 14:02:41 |只看该作者
crossing先生,请帮我看看这个问题啊,谢谢

#!/usr/bin/python
#coding=utf-8
#author=xuqq
#下面这个程序是练习正则表达式的
#从下面一段文本中,匹配出所有s开头,e结尾的单词。


import re

def main():
    text = "site sea sue sweet see case sse ssee loses"
    #m = re.findall("\bs.*e\b", text)            #返回结果是一个包含所有匹配的list。贪婪匹配
    #m = re.findall(r"\bs\S*?e\b",text)             #返回结果是匹配到最短的就停止,懒惰匹配
    m = re.findall(r'\bs\S*?e\b',text)
    if m:
        print m
    else:
        print 'not match'
    #print "\bhi"
    #print r"\bhi"             #加r是为了把所有字都打出来,不转义。因为python的字符串碰到“\”就会转义它后面的字符。如果你想在字符串里打“\”,则必须要打“\\”。
    print "我们看看转义了吗,加了r之后:\t", r"\bs\S*?e\b"        #打出来\b什么的都在
   
if __name__=='__main__':
    main()
   
#“.”在正则表达式中表示:  除换行符以外的任意字符。
#“\S”,它表示:           不是空白符的任意字符。注意是大写字符S。
#“*”表示:                数量:它表示前面的字符可以重复任意多次(包括0次)

输出下来的问题如下:
print "我们看看转义了吗,加了r之后:\t", r"\bs\S*?e\b"        #打出来\b什么的都在

m = re.findall(r"\bs\S*?e\b",text)             #返回结果是匹配到最短的就停止,懒惰匹配

同样的r
放在print里面,就是照实打出来

r放在正则表达式里 ,\b \S什么的就不是照实打了,还是转义了

m= re.findall(r"\bs\S*?e\b",text)   “改成 '  试试
匹配出来的结果一样

就是我发现,同样的一个正则规则,放在print里面和放在re.findall里面有差别

同时,照理说,双引号转义,单引号不转,但是单引号放在re.findall里面,也没有转义啊,大神
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

38#
发表于 2016-2-4 21:45:54 |只看该作者
xqqxjnt1988 发表于 2016-2-4 14:02
crossing先生,请帮我看看这个问题啊,谢谢

#!/usr/bin/python

转不转义和是不是单引号双引号没关系。

正则里加r,是保证这个规则不转义,所以这个规则字符串是\b \S,它们应用到搜索,是去匹配对应的规则。
如果是要匹配\b或者\S这种字符本身,那这个规则要防止这些元字符的转义。所以得用r"\\b" r"\\S"

可能比较绕。建议自己把几种情况再多试试,体会一下
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

39#
发表于 2016-2-4 21:55:24 |只看该作者
catherinemic 发表于 2016-2-2 14:46
Crossin老师,想问一下,既然r'\bhi'表示非转译的原始字符‘\bhi',但是为什么re.findall(r'\bhi', text)的 ...

我前面说的可能有点不对。如果一段话中有\bhi这个文字,你想匹配出来,规则需要写成
r"\\bhi"
以防止\b作为特殊元字符去匹配
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

40#
发表于 2016-2-4 22:05:04 |只看该作者
catherinemic 发表于 2016-2-2 14:46
Crossin老师,想问一下,既然r'\bhi'表示非转译的原始字符‘\bhi',但是为什么re.findall(r'\bhi', text)的 ...

我前面说的可能有点不对。如果一段话中有\bhi这个文字,你想匹配出来,规则需要写成
r"\\bhi"
以防止\b作为特殊元字符去匹配
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-25 12:36 , Processed in 0.030649 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部