Chinaunix

标题: 问一个正则问题,高手快来帮忙啊~,在线等待中.... [打印本页]

作者: Heaice    时间: 2009-02-26 15:54
标题: 问一个正则问题,高手快来帮忙啊~,在线等待中....
>>> import re
>>> s='/home/shif/afa/ag/'
>>> ss=re.match('/$',s)
>>> print ss
None
>>>


为什么不能匹配最后一个/啊?
作者: xiaoyu9805119    时间: 2009-02-26 16:16
match方法从开头进行匹配,看官方解释。
match(pattern, string, flags=0)
    Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found.

>>> re.match("c","abc")
>>> re.match("a","abc")
<_sre.SRE_Match object at 0x00AFDD08>

你可以尝试search方法,应该是你想要的

[ 本帖最后由 xiaoyu9805119 于 2009-2-26 16:20 编辑 ]
作者: Heaice    时间: 2009-02-26 16:26
原帖由 xiaoyu9805119 于 2009-2-26 16:16 发表
match方法从开头进行匹配,看官方解释。
match(pattern, string, flags=0)
    Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found.

> ...



多谢多谢哈~
作者: Heaice    时间: 2009-02-26 16:36
>>> s1 = 'klajgklasklajgklasj\\'
>>> ss = re.search('\\$',s1)
>>> print ss
None
>>>

很奇怪啊~为什么\就匹配不了?
作者: xiaoyu9805119    时间: 2009-02-26 16:40
re.search('\\\\$',s1)
要用四个斜杠
作者: Heaice    时间: 2009-02-26 16:42
原帖由 Heaice 于 2009-2-26 16:36 发表
>>> s1 = 'klajgklasklajgklasj\\'
>>> ss = re.search('\\$',s1)
>>> print ss
None
>>>

很奇怪啊~为什么\就匹配不了?



这个变态得python啊~我该怎么说你哦~

>>> s1 = 'klajgklasklajgklasj\\'
>>> ss = re.search('\\\\$',s1)
>>> print ss
<_sre.SRE_Match object at 0x01514640>
>>>
作者: xiaoyu9805119    时间: 2009-02-26 16:45
原帖由 Heaice 于 2009-2-26 16:42 发表



这个变态得python啊~我该怎么说你哦~

>>> s1 = 'klajgklasklajgklasj\\'
>>> ss = re.search('\\\\$',s1)
>>> print ss

>>>

不是py变态~~~
\\只是表示一个斜杠,你要表示两个只能四个\
作者: Heaice    时间: 2009-02-26 16:57
原帖由 xiaoyu9805119 于 2009-2-26 16:45 发表

不是py变态~~~
\\只是表示一个斜杠,你要表示两个只能四个\



但是字符串中实际上是只有一个\,而匹配的也就是这个

>>> print s1
klajgklasklajgklasj\
>>>

[ 本帖最后由 Heaice 于 2009-2-26 16:59 编辑 ]
作者: xiaoyu9805119    时间: 2009-02-26 17:01
>>> s1 = 'klajgklasklajgklasj\\'
>>> s1
'klajgklasklajgklasj\\'
因为你这里是单引号,里面的\\就是两个\,不是一个哦。

怕麻烦的话用
>>> re.search(r'\\$',s1)
r加在正则前面就ok了
作者: Heaice    时间: 2009-02-26 17:19
原帖由 xiaoyu9805119 于 2009-2-26 17:01 发表
>>> s1 = 'klajgklasklajgklasj\\'
>>> s1
'klajgklasklajgklasj\\'
因为你这里是单引号,里面的\\就是两个\,不是一个哦。

怕麻烦的话用
>>> re.search(r'\\$',s1)
r加在正则前面就ok了



我尝试了下把字符串(aslkgjaslkgjslakjglsa\)从文件中读取出来,那么文件中的字符串\就只有一个了.

但是在匹配的时候还是需要4个\,因为在读取字符串的时候,python就加了一个进去

>>> f=open('c:\\123.txt','r')
>>> print f
<open file 'c:\123.txt', mode 'r' at 0x015DD6B0>
>>> s=f.readline()
>>> s
'aslkgjaslkgjslakjglsa\\'
作者: zhenglxd    时间: 2009-02-26 17:21
我也刚弄懂来敲打敲打你!
字符窜里确实只有一个\
print "\\"
>\
但是 变态的是要表示一个\必须要 4个\才可以
>>> s1 = 'klajgklasklajgklasj\\'
>>> ss = re.search('\\\\$',s1)
>>> print ss

s1 = 'klajgklasklajgklasj\\'打印出来最后斜杠是1个
到re里要表示一个反斜杠需要两个反斜杠
到string里要表示2个反斜杠 要用4个反斜杠
简单说就是 s1里的一个反斜杠=search里4个 所以建议用 r
作者: xiaoyu9805119    时间: 2009-02-26 17:23
>>> s
>>> print s
这两个是不一样的,呵呵。s是返回repr(s)。
不管了,只要捣鼓出结果就ok了,解决问题就好
作者: zhenglxd    时间: 2009-02-26 17:23
标题: 回复 #11 zhenglxd 的帖子
在简单说就是 你的s1和ss 分别要对反斜杠 进行处理
而且 他们不是对等的不能直接比较
s1还要在对处理后的反斜杠再处理 才能开始比较
作者: Heaice    时间: 2009-02-26 17:25
原帖由 zhenglxd 于 2009-2-26 17:21 发表
我也刚弄懂来敲打敲打你!
字符窜里确实只有一个\
print "\\"
>\
但是 变态的是要表示一个\必须要 4个\才可以
>>> s1 = 'klajgklasklajgklasj\\'
>>> ss = re.search('\\\\$',s1)
>>> print ss

s1  ...



多谢多谢,很感谢两位热心帮助.刚去瞧了下官方文档的说法,原文如下:

Regular expressions use the backslash character ('\') to indicate special forms or to allow special characters to be used without invoking their special meaning. This collides with Python’s usage of the same character for the same purpose in string literals; for example, to match a literal backslash, one might have to write '\\\\' as the pattern string, because the regular expression must be \\, and each backslash must be expressed as \\ inside a regular Python string literal.
The solution is to use Python’s raw string notation for regular expression patterns; backslashes are not handled in any special way in a string literal prefixed with 'r'. So r"\n" is a two-character string containing '\' and 'n', while "\n" is a one-character string containing a newline. Usually patterns will be expressed in Python code using this raw string notation.

[ 本帖最后由 Heaice 于 2009-2-26 17:29 编辑 ]
作者: zhenglxd    时间: 2009-02-26 18:37
标题: 回复 #14 Heaice 的帖子
楼主,我到家了!经过我在车上的深思熟虑,我决定以比较浅显的方式,把这个哥德巴赫都曾经猜想不出并深深困扰你我的问题来给你个最能理解的解答!
所谓笨蛋并不可怕,可怕的是这个蛋不知道自己笨在哪里!又所谓笨蛋复笨蛋,笨蛋何其多,没人教他们,怎么边聪明,所以我决定以海一样的胸怀阳光的博爱,将你拉出这深深的沼泽!
开场白完,下面是实质内容。

首先我们的概念错了!
所谓正则式 是规范程序内部字符窜书写的一种方式。
分3个部分,一个是 你希望得到的外部输出结果(print 打印出来的内容) 一个是正则式 一个是内部匹配的字符窜

我们更具需要的外部输出结果 来编写正则 然后和 内部字符窜进行匹配
有注意到我用外部和内部来区分了没

内部的一段字符窜经过特殊处理 用print出来的结果 和内部书写的不一定一致的。
而正则式 是和内部的字符窜进行匹配 而不是和这个内部字符窜所表现的外部结果所匹配

所以外部结果 \ 内部字符窜要书写为\\ 而正则是要和内部字符窜做匹配的 所以他必须要\\\\来表示\\ 在和字符窜匹配

所以如果你要在外部print 一个\ 内部书写的时候就成了'\\'而正则是匹配的时候就是"\\\\"
作者: xiaoyu9805119    时间: 2009-02-27 09:09
原帖由 zhenglxd 于 2009-2-26 18:37 发表
楼主,我到家了!经过我在车上的深思熟虑,我决定以比较浅显的方式,把这个哥德巴赫都曾经猜想不出并深深困扰你我的问题来给你个最能理解的解答!
所谓笨蛋并不可怕,可怕的是这个蛋不知道自己笨在哪里!又所谓 ...

你太有才了!
作者: Heaice    时间: 2009-02-27 11:01
继续请问,如果要匹配以/或者a:开头,且以/或者\或者任意字母和数字结尾的字符串的正则表达式怎么写?

比如:
s=/afafaklfjaghkjf\afag/
s1=a:afasdf\adsfa\
s2=/:afsga/adsf
s3=a:adjkh\\d:alfkfj/jkf\adsf
s4=askfh\asfg/askgjk
s5=sadlkjfa:kj\asifj/

也就是说,对如上6个字符串,可以匹配s,s1,s2,s3,但是不能匹配s4,s5

我是搞出来了可以匹配前面,也可以匹配后面,但是就不能连起来.

匹配前面:ss=re.search('^\w: |^/,s)
匹配后面的:ss=re.search('/$|\\\\$|\w*$',s)

但是连接起来ss=re.search('^\w: |^/s\w*/$|\\\\$|\w*',s)就是不能匹配,到底怎么回事?

因:和|写在一起会变成表情,所以我在中间加了个空格

[ 本帖最后由 Heaice 于 2009-2-27 11:04 编辑 ]
作者: zhenglxd    时间: 2009-02-27 12:00
标题: 回复 #17 Heaice 的帖子
import re
p=re.compile("""r'^
                  (/+|"a:"+)
                  (/+|\\+|.+)
                  $
                  """,re.X)
不知道对不对啊!最近一搞这个就头痛啊 所以不试验了
作者: Heaice    时间: 2009-02-27 16:31
原帖由 zhenglxd 于 2009-2-27 12:00 发表
import re
p=re.compile("""r'^
                  (/+|"a:"+)
                  (/+|\\+|.+)
                  $
                  """,re.X)
不知道对不对啊!最近一搞这个就头痛啊 所以不试验了



这个不对啊~所有字符串都能匹配啊~

不能满足可以匹配s,s1,s2,s3,但是不能匹配s4,s5
作者: zhenglxd    时间: 2009-02-27 20:02
标题: 回复 #19 Heaice 的帖子
天之道损有余,而补不足,故大道四九而缺一,是完满而非大完满,生灵之道皆苟存于天道下,嫣能完满?故楼主不得解嫣,然人之道在为合,合为和也,彼之所长,吾之所短,彼之所短吾之所长也,互持互助,乃至完满
help you is help me
its True!
开场白完放答案!

p=re.compile(r"""
^
(/|a:)
.*
(/|\\|.)
$
""",re.X)
s='/afafaklfjaghkjf\\afag/'
s1='a:a:fa:sdf\\adsfa\\'
s2='/:afsga/adsf'
s3='a:a:djkh\\d:alfkfj/jkf\\adsf'
s4='askfh\\asfg/askgjk'
s5='sadlkjfa:kj\\asifj/'

print p.findall(s)
print p.findall(s1)
print p.findall(s2)
print p.findall(s3)
print p.findall(s4)
print p.findall(s5)
print re.search(p,s)
print re.search(p,s1)
print re.search(p,s2)
print re.search(p,s3)
print re.search(p,s4)
print re.search(p,s5)
>>>
[('/', '/')]
[('a:', '\\')]
[('/', 'f')]
[('a:', 'f')]
[]
[]
<_sre.SRE_Match object at 0x00C84F98>
<_sre.SRE_Match object at 0x00C84F98>
<_sre.SRE_Match object at 0x00C84F98>
<_sre.SRE_Match object at 0x00C84F98>
None
None

[ 本帖最后由 zhenglxd 于 2009-2-27 20:04 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2