免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: Heaice
打印 上一主题 下一主题

问一个正则问题,高手快来帮忙啊~,在线等待中.... [复制链接]

论坛徽章:
0
11 [报告]
发表于 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

论坛徽章:
0
12 [报告]
发表于 2009-02-26 17:23 |只看该作者
>>> s
>>> print s
这两个是不一样的,呵呵。s是返回repr(s)。
不管了,只要捣鼓出结果就ok了,解决问题就好

论坛徽章:
0
13 [报告]
发表于 2009-02-26 17:23 |只看该作者

回复 #11 zhenglxd 的帖子

在简单说就是 你的s1和ss 分别要对反斜杠 进行处理
而且 他们不是对等的不能直接比较
s1还要在对处理后的反斜杠再处理 才能开始比较

论坛徽章:
0
14 [报告]
发表于 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 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2009-02-26 18:37 |只看该作者

回复 #14 Heaice 的帖子

楼主,我到家了!经过我在车上的深思熟虑,我决定以比较浅显的方式,把这个哥德巴赫都曾经猜想不出并深深困扰你我的问题来给你个最能理解的解答!
所谓笨蛋并不可怕,可怕的是这个蛋不知道自己笨在哪里!又所谓笨蛋复笨蛋,笨蛋何其多,没人教他们,怎么边聪明,所以我决定以海一样的胸怀阳光的博爱,将你拉出这深深的沼泽!
开场白完,下面是实质内容。

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

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

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

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

所以如果你要在外部print 一个\ 内部书写的时候就成了'\\'而正则是匹配的时候就是"\\\\"

论坛徽章:
0
16 [报告]
发表于 2009-02-27 09:09 |只看该作者
原帖由 zhenglxd 于 2009-2-26 18:37 发表
楼主,我到家了!经过我在车上的深思熟虑,我决定以比较浅显的方式,把这个哥德巴赫都曾经猜想不出并深深困扰你我的问题来给你个最能理解的解答!
所谓笨蛋并不可怕,可怕的是这个蛋不知道自己笨在哪里!又所谓 ...

你太有才了!

论坛徽章:
0
17 [报告]
发表于 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 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-02-27 12:00 |只看该作者

回复 #17 Heaice 的帖子

import re
p=re.compile("""r'^
                  (/+|"a:"+)
                  (/+|\\+|.+)
                  $
                  """,re.X)
不知道对不对啊!最近一搞这个就头痛啊 所以不试验了

论坛徽章:
0
19 [报告]
发表于 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

论坛徽章:
0
20 [报告]
发表于 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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP