相关文章推荐
幸福的红酒  ·  將一個欄位拆分為多個欄位 - Tableau·  2 月前    · 
飞奔的山羊  ·  ms-sql server sql ...·  2 月前    · 
从容的生姜  ·  使用 Java 列出 Blob - ...·  2 月前    · 
爱听歌的水桶  ·  山东省商务厅 法国概况 法国主要城市·  1 年前    · 
不爱学习的葡萄  ·  抖音熊暴尼最新定制套图很美 ...·  1 年前    · 
仗义的柳树  ·  《什么是摩尔庄园》之剧情篇:么么公主黑化?全 ...·  1 年前    · 
酒量大的奔马  ·  钢铁魔女动漫OP ...·  1 年前    · 
冷静的大熊猫  ·  公务员用母猪激素“投毒”?官方回应来了!但这 ...·  2 年前    · 
Code  ›  如何在python中分割但忽略带引号的字符串中的分隔符?开发者社区
python 引号 分隔符
https://cloud.tencent.com/developer/ask/sof/64143
行走的酱肘子
1 年前
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
提问

问 如何在python中分割但忽略带引号的字符串中的分隔符?

Stack Overflow用户
提问于 2010-05-07 10:13:06
EN

我需要像这样拆分字符串,使用分号。但我不想拆分字符串(‘或")中的分号,我不是在解析文件;我只是解析一个没有换行的简单字符串。

part 1;"this is ; part 2;";'this is ; part 3';part 4;this "is ; part" 5

结果应该是:

  • part 1
  • "this is;第2部分;“
  • ‘this is;part 3'
  • part 4
  • this "is;part”5

我认为这可以使用正则表达式来完成,但如果不能,我可以采用另一种方法。

17 65.5K 1 票数 70
EN
python
regex

回答 17

Stack Overflow用户

回答已采纳

发布于 2010-05-07 15:59:50

大多数答案似乎都过于复杂了。You ‘t back references。 ‘t 不需要依赖于re.findall是否提供重叠匹配。假设输入不能被csv模块解析,因此正则表达式是唯一可行的方法,您所需要的就是使用与字段匹配的模式调用re.split。

注意,在这里匹配字段要比匹配分隔符容易得多:

代码语言: javascript
复制
import re
data = """part 1;"this is ; part 2;";'this is ; part 3';part 4;this "is ; part" 5"""
PATTERN = re.compile(r'''((?:[^;"']|"[^"]*"|'[^']*')+)''')
print PATTERN.split(data)[1::2]

输出结果为:

代码语言: javascript
复制
['part 1', '"this is ; part 2;"', "'this is ; part 3'", 'part 4', 'this "is ; part" 5']

正如Jean-Luc Nacif Coelho正确指出的那样,这将无法正确处理空组。这取决于可能或不重要的情况。如果这很重要,例如,可以通过将 ';;' 替换为 ';<marker>;' 来处理它,其中 <marker> 必须是您知道在拆分之前不会出现在数据中的某个字符串(不带分号)。此外,您还需要在以下情况下恢复数据:

代码语言: javascript
复制
>>> marker = ";!$%^&;"
>>> [r.replace(marker[1:-1],'') for r in PATTERN.split("aaa;;aaa;'b;;b'".replace(';;', marker))[1::2]]
['aaa', '', 'aaa', "'b;;b'"]

然而,这是一个杂乱无章的东西。有什么更好的建议吗?

票数 54
EN

Stack Overflow用户

发布于 2010-05-07 18:57:58

代码语言: javascript
复制
re.split(''';(?=(?:[^'"]|'[^']*'|"[^"]*")*$)''', data)

每次找到分号时,lookahead都会扫描整个剩余的字符串,确保有偶数个单引号和一个偶数个双引号。(忽略双引号字段中的单引号,反之亦然。)如果先行操作成功,分号就是分隔符。

与匹配字段而不是分隔符的 Duncan's solution 不同,它不存在空字段的问题。(甚至不是最后一个:与许多其他 split 实现不同,Python的实现不会自动丢弃尾随的空字段。)

票数 41
EN

Stack Overflow用户

发布于 2016-02-23 12:38:14

代码语言: javascript
复制
>>> a='A,"B,C",D'
>>> a.split(',')
['A', '"B', 'C"', 'D']
It failed. Now try csv module
>>> import csv
>>> from StringIO import StringIO
>>> data = StringIO(a)
 
推荐文章
幸福的红酒  ·  將一個欄位拆分為多個欄位 - Tableau
2 月前
飞奔的山羊  ·  ms-sql server sql 把逗号分隔的字符串分开_sql server 查询特殊符号拆分
2 月前
从容的生姜  ·  使用 Java 列出 Blob - Azure Storage | Microsoft Learn
2 月前
爱听歌的水桶  ·  山东省商务厅 法国概况 法国主要城市
1 年前
不爱学习的葡萄  ·  抖音熊暴尼最新定制套图很美 抖音熊暴尼全套微密摄影作品合集_火之木叶吧_百度贴吧
1 年前
仗义的柳树  ·  《什么是摩尔庄园》之剧情篇:么么公主黑化?全新剧情曝光!|游民星空
1 年前
酒量大的奔马  ·  钢铁魔女动漫OP 鋼鉄の魔女アンネローゼ_哔哩哔哩_bilibili
1 年前
冷静的大熊猫  ·  公务员用母猪激素“投毒”?官方回应来了!但这些通报以外的问题更让人担心…… - 21财经
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号