当前位置: 首页 > 面试题库 >

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

沙宣
2023-03-14
问题内容

我需要在分号上分割这样的字符串。但是我不想分割字符串(“或”)内的分号。我不是在解析文件;只是一个没有换行符的简单字符串。

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

结果应为:

  • 第1部分
  • “这是;第2部分;”
  • ‘这是 ; 第三部分
  • 第4部分
  • 这是“一部分” 5

我想这可以用正则表达式来完成,但是如果不能的话;我愿意接受另一种方法。


问题答案:

大多数答案似乎过于复杂。你 并不 需要反向引用。你 并不
需要依赖于是否re.findall给出重叠的匹配。鉴于输入无法使用csv模块进行解析,因此正则表达式是唯一可行的方法,您所要做的就是使用与字段匹配的模式调用re.split。

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

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]

输出为:

['part 1', '"this is ; part 2;"', "'this is ; part 3'", 'part 4', 'this "is ; part" 5']

正如Jean-Luc Nacif
Coelho正确指出的那样,这将无法正确处理空组。根据情况可能会或可能不会重要。如果确实如此,则可以通过以下方式处理该问题,例如,将必须知道在拆分之前未出现在数据中的某些字符串(不带分号)替换';;'';<marker>;'where
<marker>。另外,您还需要在以下时间恢复数据

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

但是,这太过分了。还有更好的建议吗?



 类似资料:
  • 问题内容: 我有一个模糊的字符串,像这样: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。(编辑:我想我的意思是那些已经属于JDK或已经属于诸如Apache Commons之类的常用库的库。) 上面的字符串应分为: 注意:这不是CSV文件,它是文件中包含的单个字符串,具有较大的整体

  • 问题内容: 我有这样一个字符串: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。 上面的字符串应分为: 问题答案: 可以使用正则表达式 输出:

  • 问题内容: 我需要编写一个扩展版本的StringUtils.commaDelimitedListToStringArray函数,该函数具有一个附加参数:转义字符。 所以打电话给我: 应该返回: 我当前的尝试是使用String.split()使用正则表达式拆分String: 但是返回的数组是: 有任何想法吗? 问题答案: 正则表达式 意思是“匹配不是反斜杠后跟逗号的字符”-这就是为什么模式之所以匹配

  • 问题内容: 我有一个像这样的字符串: 上面的字符串应分为: 问题答案: 我认为最简单的解决方案是处理输入字符串char-by-char: 例: 作为免费赠品,此解决方案还根据需要计算嵌套括号: 它还检查括号是否平衡(每个开放的括号都有相应的结束符)。

  • 在逗号处划分字符串的最佳方法是什么,这样每个单词都可以成为ArrayList的一个元素? 例如:

  • 我有一根下面这样的弦- value1,value2,value3,value4,“value5,1234”,value6,value7,“value8”,value9,“value10,123.23”

  • 问题内容: 我有一个看起来像这样的字符串: Python中是否有内置类/函数将采用该字符串并构造一个字典,就像我已经做到了那样: 我浏览了可用的模块,但似乎找不到任何匹配的模块。 谢谢,我确实知道如何自己编写相关代码,但是由于此类较小的解决方案通常是等待发生的雷区(即有人写道:Name1 =’Value1 = 2’;)等,因此我通常更喜欢使用测试功能。 那我自己去做 问题答案: 没有内置功能,但是

  • 我收到了很多文件,其中我的控制为零,我需要根据分隔符进行拆分。但是当分隔符在引号内时,我不想拆分。因此,列 1、列 2、列 3 是 然而,column1、“column2”、column3是 这可以使用此正则表达式(在 C# 下) 现在,我的问题是当有一行只有一个双引号(仅打开或关闭)时,例如第1列,第2列",第3列返回 虽然它应该返回 我发现很多与正则表达式相关的,但在上面的特定示例中,它们都失