【问题标题】:How to split by space but ignore it in multiple double-quotes? [closed]如何按空格分割但在多个双引号中忽略它? [关闭]
【发布时间】:2013-11-26 04:54:14
【问题描述】:

我需要拆分用空格分隔的不同字符串,但我想忽略嵌套双引号或任何双引号组合中的空格。这是一个例子:

c "a " bbh "." d1 

输出应该是这样的:

c
"a " bbh "." 
 d1

或者像这样的双引号的其他组合:

c "a "bbh"" d1 

输出应该是这样的:

c
"a "bbh"" 
d1

有什么方法可以排除双引号的任意组合吗?

*编辑*

再举一个例子:

c "a " bbh "." d1 kj "mn"

输出应该是这样的:

c
"a " bbh "."
d1
kj
"mn"

编辑

感谢你们的帮助。其实我是根据我掌握的数据问这个问题的。使我的问题定义不明确的是数据的错误格式!

【问题讨论】:

  • 当您说“任何双引号组合”时,您是否包含奇数个双引号?是否要排除(从拆分)字符串中第一个和最后一个双引号之间的所有文本?
  • 你怎么知道"a "bbh""是一个带引号的字符串,还是"a "bbh(不带引号)和""的字符串?
  • @PeterAlfvin 其实不,双引号的个数是偶数,但是我们不能说字符串中第一个和最后一个双引号之间的所有文本,因为字符串可能是这样的:c"一个“bbh”。 d1 kj "nh"
  • 那么我和@Blckknght 有同样的问题。我认为您的问题没有明确定义。
  • @Blckknght 如果我猜对了,我想用空格分隔字符串,但我想跳过多个(偶数个)双引号内的任何空格。在"a "bbh"" 中只有一个空格,但我想跳过它,"a "bbh"" 只是一个标记。

标签: python regex python-3.x


【解决方案1】:

您尝试使用双引号,就像人们通常使用括号一样。您的最后一个示例可以重写为

c (a ( bbh ).) d1 kj (mn)

事实上,它需要以这种方式重写才能完全解决。语义上无法知道您希望将示例翻译为上面的字符串还是

c (a ( bbh (.) d1 kj )mn)

c (a ) bbh (.) d1 kj (mn)

字符串中的引号越多,解释的方式就越多。事实上,最后两个是更明显的解释,因为后者是编程语言中引号通常的工作方式,而前者可以被认为是一种贪婪的正则表达式(如 bcorso 的解决方案)。

所以你想要的是不可能的,但如果你稍微改变一下,就可以通过递归解决方案(但不是正则表达式,因为你需要检查平衡括号)。

【讨论】:

    【解决方案2】:

    你可以试试正则表达式

    >>> strs = re.split(r'(".+")+', 'c "a " bbh "." d1 ')
    
    >>> strs = strs[0].split(" ") + strs[1] + strs[2].split(" ")
    
    >>> strs = filter(None, strs)
    

    它将字符串划分为双引号之前的所有内容、双引号之间的所有内容以及之后的所有内容。然后根据双引号前后的空格完成分区。

    【讨论】:

    • 谢谢,但它在标记中包含分隔符(空格),并且在此类示例中也不起作用:c "a " bbh "." d1 kj "mn"
    • 那是因为该示例定义不明确。删除多余的空格也很容易,但首先要重申你的问题,这样才有意义。
    猜你喜欢
    • 2017-09-02
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多