我的代码:
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")
但这并没有抓住第一个数字。
我错了什么?
答案 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()