【问题标题】:Python: Splitting by certain patternPython:按特定模式拆分
【发布时间】:2013-02-11 14:33:41
【问题描述】:

我有以下

str = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'

我想拆分它,以便我有一个字符串数组,如

['[5.955894, 45.817792]', '[10.49238, 45.817792]', ...]

因此 [...] 对象是数组的元素。包含封闭的 [ 和 ] 很重要。我已经来了这么远:

re.split('\D,\s\D', str)

但这给了我:

['[5.955894, 45.817792', '10.49238, 45.817792', '10.49238, 47.808381', '5.955894, 47.808381]']

不是我想要的。

【问题讨论】:

  • eval('[' + str + ']') 如果它来自受信任的来源。
  • 你最终想达到什么目标?
  • 我的问题中的第二行代码。这就是我想要的。
  • @nhahtdh -- eval 不会提供 OP 想要的东西,但作为旁注,有 ast.literal_eval 可以做与 eval 相同的事情,而没有安全隐患。

标签: python regex split


【解决方案1】:

我更喜欢使用re.findall 并指定我想要的,而不是尝试描述re.split 的分隔符

>>> s = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
>>> re.findall(r"\[[^\]]*\]",s)
['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]']
  1. \[ 匹配 [
  2. [^\]]* 匹配除 ]​​i> 之外的任何内容
  3. \] 匹配]

【讨论】:

  • 或者,您可以使用非贪婪版本,而不是 X-then-anything-but-Y-then-Y 模式:r"\[.*?\]"
【解决方案2】:

您需要将re.splitlook-ahead一起使用:

>>> s = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'

>>> re.split(",[ ]*(?=\[)", s)
['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]']

并且不要使用str 作为变量。它是内置的阴影。

以下模式:

,[ ]*(?=\[)

将匹配comma(,) 和一些空格,然后是[

您甚至可以使用look-behind 来实现。所以,(?<=\]),[ ]* 也可以。

【讨论】:

  • 为什么不直接r"(?<=\]),"
  • @mgilson。是的,这两个实际上都不是必需的。
  • 虽然我确实认为必须匹配逗号周围的空格以防止它出现在输出中——尽管我通常会使用\s* 而不是[ ]*——但它我想这一切都取决于你想要匹配的内容。
  • @mgilson.. 好吧,如果可以有任何其他类型的空格,如制表符或换行符,而不仅仅是space,那么将需要\s。但这也取决于OP,他想要什么。
【解决方案3】:

这是我写的一个幼稚的程序,我认为它可以解决您的问题,但不是最好的。

>>>def split_string(strg, begin = '[', end = ']'):  
    myList = []  
    string = ''  
    for char in strg:  
        if char == begin:  
            string = ''  
        string += char  
        if char == end:  
            myList.append(string)  
    return myList  
>>>strg = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'  
>>>split_string(strg)  
['[5.955894, 45.817792]', '[10.49238, 45.817792]', '[10.49238, 47.808381]', '[5.955894, 47.808381]']

【讨论】:

    【解决方案4】:

    从@nhahtdh 评论开始。

    取决于您的信任问题。

    In [510]: txt = '[5.955894, 45.817792], [10.49238, 45.817792], [10.49238, 47.808381], [5.955894, 47.808381]'
    
    In [511]: lst = eval ("[%s]" % txt)
    
    In [512]: [str(x) for x in lst]
    Out[512]:
    ['[5.955894, 45.817792]',
     '[10.49238, 45.817792]',
     '[10.49238, 47.808381]',
     '[5.955894, 47.808381]']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2015-08-08
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多