python re,提取逗号之间的值

python re,提取逗号之间的值,python,regex,Python,Regex,为什么下一个正则表达式返回“a”和“b”之间的空字符串 In [48]: pat = re.compile(".*?(?=,|$)") In [49]: it = pat.findall('a,b') In [50]: it Out[50]: ['a', '', 'b', ''] 如何提取逗号之间的子字符串 编辑: 我很好奇如何使用正则表达式 编辑: 正则表达式应成功提取此输入“,”中的树空字符串。您可以执行以下操作: st='a,b, c , d, eeeee' data=[e.s

为什么下一个正则表达式返回“a”和“b”之间的空字符串

In [48]: pat = re.compile(".*?(?=,|$)")

In [49]: it = pat.findall('a,b')

In [50]: it
Out[50]: ['a', '', 'b', '']
如何提取逗号之间的子字符串

编辑: 我很好奇如何使用正则表达式

编辑: 正则表达式应成功提取此输入“,”中的树空字符串。

您可以执行以下操作:

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']
  • *?
    首先匹配
    a
    ,因为下一个字符是
  • 正则表达式引擎现在位于
    前面的位置
  • 现在,
    *?
    匹配
    前面的空字符串(因为星号允许零长度匹配)
  • 正则表达式引擎在零长度匹配后前进一个字符(它必须前进,否则将永远卡在这里)
  • *?
    现在匹配
    b
    ,因为我们在字符串的末尾
  • 正则表达式引擎现在位于字符串的末尾
  • *?
    匹配字符串结尾之前的空字符串
  • 绳子断了。正则表达式引擎结束
最好的解决方案是简单地用逗号分割

如果坚持使用正则表达式,则会有点复杂,因为(根据),
re.findall()
包含空匹配,除非它们触及另一个匹配的开头。这意味着我们必须使用a,而不是您使用的前瞻

这反过来意味着我们不能在同一个断言中检查分隔符和字符串锚点的开头,因为Python不允许在lookbehinds中使用可变宽度正则表达式(sigh)。但有可能是这样的:

>>> re.findall("(?:^|(?<=,))[^,]*", "a,b,,c")
['a', 'b', '', 'c']

>>re.findall((?:^ |)(?我认为问题在于,整个正则表达式在前瞻断言之前包含“可选”字符消耗

随着匹配位置的前进,它可以匹配某些内容,也可以不匹配任何内容。
当它不匹配时,数组将填充一个
'

所以
a,b
匹配“a”,“b”,“b”

如果最后一个“”是字符串的结尾(就像
*$
匹配空字符串一样)

为什么不在
上拆分,
?(另外,*表示0或更多,所以…)我想了解如何使用regex执行此操作如果我不希望空匹配,我应该怎么做,但我希望空字符串以两个连续的逗号返回“,”,,“?@msh-这是一个好问题。我不认为像
(?=,)|.+(?=,|$)
这样的东西能够在不消耗至少一个逗号的情况下通过这两个
。然后引擎只在非消耗的情况下在字符上前进。@msh:好的,正则表达式是可能的,但与简单的
.split()
。请参阅我的编辑。谢谢您的回答