re 正则表达式?

>>> import re

>>> a = '1,2,"3,4",5,6,"7,8",9,0'
>>> b = re.findall('(\".*?\")', a)
>>> print(b)
['"3,4"', '"7,8"']

上述为选择带引号的内容,如何利用该正则表达式反选得到下列结果?
['1', '2', '5', '6', '9', '0']

阅读 2k
2 个回答

引号之外的内容是以逗号分割的,所以一定少不了逗号分割的步骤

先把字符串 a 改复杂些用于测试

a = '"3,4",1,2,"3,4","3,4",5,6,"7,8",9,0,"3,4"'

以下的几种做法都可以达到效果

删除带引号的文本,再以逗号分割

re.sub('(?:".*?",?|,".*?")', '', a).split(',')
# ['1', '2', '5', '6', '9', '0']

匹配以逗号分割的文本,且不包含逗号和引号

re.findall('(?<![^,])[^,"]*(?![^,])', a)
# ['1', '2', '5', '6', '9', '0']

匹配以引号之外的逗号分割的文本,再过滤出未带引号的文本

[m[1] for m in re.finditer('(?:".*?"|(.*?))(?:,|$)', a) if m[1]]
# ['1', '2', '5', '6', '9', '0']

re.sub('(\".*?\",*)', '', a).strip(",").split(",")

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题