gpt4 book ai didi

python - Positive Lookbehind 没有达到我的预期

转载 作者:行者123 更新时间:2023-11-28 22:37:14 24 4
gpt4 key购买 nike

  • 我想找到在 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")

但这也没有捕捉到第一个数字。

我做错了什么?

最佳答案

你应该让 ^ 成为回顾的一部分,这样它就不会被“消耗”:

>>> 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 上的正则表达式演示.

请注意,您也可以将 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

关于python - Positive Lookbehind 没有达到我的预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36714547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com