积极的Lookbehind不符合我的预期

时间:2016-04-19 09:41:15

标签: python regex python-3.x

  • 我想找到在2个或更多空格之后开始非空格的所有字符串位置
  • 我想在0或更多空格之后找到所有字符串位置。

我的代码:

r=['  200      200      200      200    ', '    3,50     3,50     3,50     3,50 ', ' 1000     1000     1000     1000    ', '1.000    1.000    1.000    1.000    ']

import regex
I=[]
p = regex.compile("^(?<=\s*)\S|(?<=\s{2,})\S")
for n in range(0,len(r)):
    itemp = []
    for m in p.finditer(r[n]):
       itemp.append(m.start())
    i.append(itemp)

这个正则表达式没有抓住第一个&#39; 1000&#39;在r [2]

我也试过这个正则表达式:

p = regex.compile("^\S|^(?<=\s+)\S|(?<=\s{2,})\S")

但这并没有抓住第一个数字。

我错了什么?

2 个答案:

答案 0 :(得分:2)

你应该制作后视镜的^部分,以免被“消耗”:

>>> p = regex.compile("(?<=^\s*)\S|(?<=\s{2,})\S") # <= HERE
>>> I=[]
>>> for n in range(0,len(r)):
    itemp = []
    for m in p.finditer(r[n]):
        itemp.append(m.start())
    I.append(itemp)


>>> I
[[2, 11, 20, 29], [4, 13, 22, 31], [1, 10, 19, 28], [0, 9, 18, 27]]

当你把它放在外面时,字符串零宽度断言的开始(或者只是一个“插入符号”)锚定表达式并在字符串的开头找到一个非空格(如果是{{1}与...不匹配 - 因此,初始结果中缺少部分。)

以下是RegexStorm的正则表达式演示。

请注意,您可以使用 1000....模块以及捕获组:

re

请参阅IDEONE demo

答案 1 :(得分:2)

除此之外, lookbehinds 似乎过于复杂。所需要的只是

re.findall(r'\s{2,}(\S+)', s)

至于寻找位置:

re.search(r'\S', s).start()