为什么下一个正则表达式在'a'和'b'中返回空字符串?
In [48]: pat = re.compile(".*?(?=,|$)")
In [49]: it = pat.findall('a,b')
In [50]: it
Out[50]: ['a', '', 'b', '']
如何在逗号之间提取子串?
编辑: 我很好奇如何使用正则表达式。
编辑: 正则表达式应该在此输入“,,”中成功提取树空字符串。
答案 0 :(得分:2)
.*?
首先匹配a
,因为下一个字符是,
。,
。.*?
匹配,
之前的空字符串(因为星号允许零长度匹配)。.*?
现在与b
匹配,因为我们位于字符串的末尾。.*?
匹配字符串结尾前的空字符串。最好的解决方案是简单地用逗号分隔。
如果你坚持使用正则表达式,它会有点复杂,因为(根据docs),re.findall()
包含空匹配,除非它们触及开头另一场比赛。这意味着我们必须使用positive lookbehind assertion而不是您使用的前瞻。
这反过来意味着我们无法在相同的断言中检查分隔符和字符串起始锚点,因为Python不允许在lookbehinds(叹气)中使用可变宽度的正则表达式。但这可能是这样的:
>>> re.findall("(?:^|(?<=,))[^,]*", "a,b,,c")
['a', 'b', '', 'c']
答案 1 :(得分:1)
你可以这样做:
st='a,b, c , d, eeeee'
data=[e.strip() for e in st.split(',')]
print data
# ['a', 'b', 'c', 'd', 'eeeee']
或使用csv:
for line in csv.reader(st.splitlines()):
print line
# ['a', 'b', ' c ', ' d', ' eeeee'] # strip as you please
或正则表达式:
print re.findall(r'([^,]+)(?:,|$)', st)
# ['a', 'b', ' c ', ' d', ' eeeee']
这可以使用正则表达式进行请求:
>>> re.findall(r'[^,]+|,\s*,', 'a,b, c ,, d, eeeee')
['a', 'b', ' c ', ',,', ' d', ' eeeee']
答案 2 :(得分:0)
我认为问题是你的整个正则表达式在前瞻断言之前包含“可选”字符消耗。
随着比赛位置的提前,它可以匹配某些东西或者什么都不匹配
如果没有匹配,则数组将填充''
。
所以a,b
匹配'a','','b',''
最后的''是字符串的结尾(正如.*$
匹配空字符串)