【问题标题】:Python positive-lookbehind split variable-widthPython正向后拆分可变宽度
【发布时间】:2014-05-09 23:57:15
【问题描述】:

虽然我已经适当地设置了表达式,但是拆分没有按预期工作。

c = re.compile(r'(?<=^\d\.\d{1,2})\s+');
for header in ['1.1 Introduction', '1.42 Appendix']:
    print re.split(c, header)

预期结果:

['1.1', 'Introduction']
['1.42',  'Appendix']

我得到以下堆栈跟踪:

回溯(最近一次通话最后一次):

中的文件“foo.py”,第 1 行 c = re.compile(r'(? 编译中的文件“C:\Python27\lib\re.py”,第 190 行
返回 _compile(模式,标志)
_compile
中的文件“C:\Python27\lib\re.py”,第 242 行 引发错误,v # 表达式无效
sre_constants.error:后视需要固定宽度的模式

【问题讨论】:

  • 错误消息说 - 你不能在 python 的正则表达式引擎中进行可变长度环视。
  • 看看regex 模块,它允许可变长度的后视。

标签: python regex string split lookbehind


【解决方案1】:

python中的lookbehinds不能是可变宽度的,所以你的lookbehind是无效的。

您可以使用捕获组作为解决方法:

c = re.compile(r'(^\d\.\d{1,2})\s+');
for header in ['1.1 Introduction', '1.42 Appendix']:
    print re.split(c, header)[1:] # Remove the first element because it's empty

输出:

['1.1', 'Introduction']
['1.42', 'Appendix']

【讨论】:

  • 只要表达式不是全局的,在第一个空格中分割是你的方法。听起来它在我的情况下会起作用。
  • @Mr.Polywhirl 它将在第一个 (^\d\.\d{1,2})\s+ 上拆分,但捕获组意味着它也会保留已拆分的字符。它将在您预期的后向拆分位置拆分。
【解决方案2】:

您在正则表达式中的错误出现在 {1,2} 部分,因为 Lookbehinds 需要是固定宽度的,因此不允许使用量词。

在您将正则表达式放入代码之前,请尝试使用 website 测试您的正则表达式。

但是在您的情况下,您根本不需要使用正则表达式:

试试这个:

for header in ['1.1 Introduction', '1.42 Appendix']:
    print header.split(' ')

结果:

['1.1', 'Introduction']
['1.42', 'Appendix']

希望这会有所帮助。

【讨论】:

  • 所以; *、+、{n}等都不允许?
  • {n} 是允许的,如果 n 是一个常数,如 1 或 2 或 5 ..等。其他是不允许的,因为长度不是恒定的。简而言之,您的字符长度应该是恒定的。
【解决方案3】:

我的解决方案可能看起来很糟糕。但是您只检查点后的两位数。所以,你可以使用两个lookbehind。

c = re.compile(r'(?:(?<=^\d\.\d\d)|(?<=^\d\.\d))\s+');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2013-04-30
    相关资源
    最近更新 更多