设为首页收藏本站

Crossin的编程教室

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

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

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

46#
发表于 2017-1-31 10:54:08 |只看该作者
红白姬 发表于 2017-1-31 10:20
C老师你好,
为什么这样输出的结果是["\\b"]而不是["\b"]?不是应该匹配出"\b"这个字符的吗?
============ ...

正则的规则:
\b 表示匹配单词边界
\\ 表示匹配字符 \
\\b 表示匹配字符 \b

所以最后匹配出的结果是 \b,因为字符串转义,在字符串中的显示是 \\b(list中保持原始的字符状态)
如果你 print m[0],就看到输出是 \b
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

36

积分

新手上路

Rank: 1

45#
发表于 2017-1-31 10:20:16 |只看该作者
  1. import re
  2. text = r"a\bc"
  3. m = re.findall(r"\\b",text)
  4. if m:
  5.     print m
  6. else:
  7.     print 'not match'
复制代码
C老师你好,
为什么这样输出的结果是["\\b"]而不是["\b"]?不是应该匹配出"\b"这个字符的吗?
================== RESTART: C:\Python27\新建文件夹\test0.py ==================
['\\b']
回复

使用道具 举报

0

主题

0

好友

24

积分

新手上路

Rank: 1

44#
发表于 2016-6-11 10:14:45 |只看该作者
import re
text = "site sea sue sweet see case sse ssee loses"
i = re.findall(r"s.*?e", text)
if i:
    print i
else:
    print 'not match'
   
回复

使用道具 举报

1

主题

1

好友

152

积分

注册会员

Rank: 2

43#
发表于 2016-2-29 13:59:38 |只看该作者
import re
text='site sea sue sweet see case sse ssee loses'
m=re.findall(r'\bs\S*?e\b',text)
if m:
    print(m)
else:
    print('not match')
回复

使用道具 举报

0

主题

1

好友

273

积分

中级会员

Rank: 3Rank: 3

42#
发表于 2016-2-12 11:42:47 |只看该作者
crossin先生 发表于 2016-2-4 22:05
我前面说的可能有点不对。如果一段话中有\bhi这个文字,你想匹配出来,规则需要写成
r"\\bhi"
以防止\b作 ...

嗯嗯,我明白了,\b在pyhon中本身有特殊含义,和在正则表达式中意义又不一样,所以需要做两层区分~~
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

41#
发表于 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
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

40#
发表于 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

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

39#
发表于 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
回复

使用道具 举报

0

主题

1

好友

61

积分

注册会员

Rank: 2

38#
发表于 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里面,也没有转义啊,大神
回复

使用道具 举报

0

主题

1

好友

273

积分

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

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

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

GMT+8, 2024-5-23 02:41 , Processed in 0.028478 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部