积极的回头看并没有达到我的预期

2024-03-29 14:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

  • 我想找到所有字符串位置,其中非空格在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)

这个正则表达式不捕捉r[2]中的第一个“1000”

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

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

但这并没有抓住第一个数字。你知道吗

我做错什么了?你知道吗


Tags: 字符串代码inimportforlenrange数字
2条回答

除此之外,lookbehinds对我来说似乎过于复杂了。所需要的只是

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

至于找位置:

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

您应该使^成为lookback的一部分,这样它就不会被“消费”了:

>>> 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]]

当您将其保留在外部时,字符串零宽度断言的开头(或只是一个“插入符号”)将锚定表达式,并在字符串的开头查找非空格(如果 1000....与之不匹配,则会导致初始结果中缺少一部分)。你知道吗

这里是RegexStorm的regex演示。你知道吗

请注意,re模块也可以用于捕获组:

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 re
I = []
p = re.compile(r"^\s*(\S)|\s{2,}(\S)")
for n in range(0,len(r)):
    itemp = []
    for m in p.finditer(r[n]):
        if (m.group(1)):              # Check if Group 1 matched
            itemp.append(m.start(1))  # Then get its start pos
        else:                         # Then Group 2 matched
            itemp.append(m.start(2))  # Get its start pos
    I.append(itemp)
print(I)

参见IDEONE demo

相关问题 更多 >