找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 12544|回复: 8

[已回复] 正则表达式报错:look-behind requires fixed-width pattern

4

主题

9

帖子

9

积分

贫民

积分
9
SHocker77 发表于 2016-9-23 10:37:36 | 显示全部楼层 |阅读模式
代码:
  1. # -*- coding:utf-8 -*-
  2. import re
  3. import sys
  4. reload(sys)
  5. sys.setdefaultencoding("utf-8")
  6. #第一个编号后面的是中文冒号,第二个编号后面的是英文冒号
  7. text = "JGood iss a 编号:123456 boy, he is 编号:123456, clever, and so on..."
  8. reg = re.compile(r'(?<=编号(:|:))\d+')
  9. match = reg.search(text)
  10. if match:
  11.     print match.group(0)
  12. else:
  13.     print 'not match'
复制代码
需求是不管遇到中文或者英文冒号,都能够打印输出后面的数字

报错信息:
  1. C:\Users\pc\Desktop>python test.py
  2. Traceback (most recent call last):
  3.   File "test.py", line 8, in <module>
  4.     reg = re.compile(r'(?<=缂栧彿(:|锛?)\s*\S+')
  5.   File "D:\Python 2.7\lib\re.py", line 190, in compile
  6.     return _compile(pattern, flags)
  7.   File "D:\Python 2.7\lib\re.py", line 245, in _compile
  8.     raise error, v # invalid expression
  9. sre_constants.error: look-behind requires fixed-width pattern
复制代码
感觉应该是中文编码的问题,但是加了
  1. import sys
  2. reload(sys)
  3. sys.setdefaultencoding("utf-8")
复制代码
还是报同样的错误,搜索过这个报错信息,没找到正确的解决方法,请帮忙看一下
回复

使用道具 举报

1

主题

13

帖子

13

积分

贫民

积分
13
python奋青 发表于 2016-9-23 22:03:50 | 显示全部楼层
把(:|:)换成[:|:]
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-9-24 21:12:55 | 显示全部楼层
我用的是python3.4.4, 以下代码正常运行, 2.x下你可以做相应更改
  1. import re
  2. import sys

  3. #第一个编号后面的是中文冒号,第二个编号后面的是英文冒号
  4. text = "JGood iss a 编号:123456 boy, he is 编号:654321, clever, and so on..."
  5. reg = re.compile(r'(?<=编号[::])\d+')
  6. match = reg.findall(text)

  7. if match:
  8.     print(match)
  9. else:
  10.     print('not match')
复制代码
回复 支持 反对

使用道具 举报

4

主题

9

帖子

9

积分

贫民

积分
9
SHocker77  楼主| 发表于 2016-9-28 16:56:01 | 显示全部楼层
whydo1 发表于 2016-9-24 21:12
我用的是python3.4.4, 以下代码正常运行, 2.x下你可以做相应更改

我是2.7,用你的代码,开头加上 # coding=utf-8,打印结果是:['654321'],不加的话是:  File "test.py", line 6
SyntaxError: Non-ASCII character '\xe7' in file test.py on line 6, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

加了之后打印出的只有英文冒号后面的数字,中文冒号还是没识别出来的感觉
回复 支持 反对

使用道具 举报

4

主题

9

帖子

9

积分

贫民

积分
9
SHocker77  楼主| 发表于 2016-9-28 16:57:47 | 显示全部楼层

谢谢回复,之前用过这种方法,我的是2.7,不知道是不是这个原因,中文的冒号单独写:?>=编号:,就可以得到中文冒号后面的数字,但是二合一的写法就跪了
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-9-28 22:03:11 | 显示全部楼层
SHocker77 发表于 2016-9-28 16:56
我是2.7,用你的代码,开头加上 # coding=utf-8,打印结果是:['654321'],不加的话是:  File "test.py" ...

text = "JGood iss a 编号:123456 boy, he is 编号:654321, clever, and so on..."
改为
text = u"JGood iss a 编号:123456 boy, he is 编号:654321, clever, and so on..."

在2.7下面,默认是bytes编码, 加上u,表示是unicode字符串
回复 支持 反对

使用道具 举报

4

主题

9

帖子

9

积分

贫民

积分
9
SHocker77  楼主| 发表于 2016-10-14 14:57:07 | 显示全部楼层
whydo1 发表于 2016-9-28 22:03
text = "JGood iss a 编号:123456 boy, he is 编号:654321, clever, and so on..."
改为
text = u"JGood ...

谢谢你,很抱歉没有及时回复,这次是项目需要临时用了python语言,论坛就很少上,你说的方法是有效果的
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2016-10-14 20:52:48 | 显示全部楼层
要是处理中文较多的话. 用python3.x会好一些. 3.x默认使用unicode
回复 支持 反对

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-10-18 08:30:39 | 显示全部楼层
whydo1 发表于 2016-10-14 20:52
要是处理中文较多的话. 用python3.x会好一些. 3.x默认使用unicode

是这样的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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