为最后一个空格分割字符串的最佳方法

时间:2014-06-24 21:57:58

标签: python regex parsing regex-lookarounds

我想知道用字符串中最后一个空格分隔由空格分隔的字符串的最佳方法,该字符串不在[, {, ( or "内。例如,我可以:

a = 'a b c d e f "something else here"'
b = 'another parse option {(["gets confusing"])}'

对于它应解析为['a', 'b', 'c', 'd', 'e', 'f'], ["something else here"]
和b应解析为['another', 'parse', 'option'], ['([{"gets confusing"}])']

现在我有这个:

def getMin(aList):  
    min = sys.maxint
    for item in aList:  
        if item < min and item != -1:
            min = item
    return min  

myList = []
myList.append(b.find('['))
myList.append(b.find('{'))
myList.append(b.find('('))
myList.append(b.find('"'))
myMin = getMin(myList)
print b[:myMin], b[myMin:]

我确信有更好的方法可以做到这一点,并且我对所有建议持开放态度

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式:

import re
def parse(text):
    m = re.search(r'(.*) ([[({"].*)', text)
    if not m:
        return None
    return m.group(1).split(), [m.group(2)]

第一部分(。*)将所有内容捕获到引号或括号中的部分,第二部分捕获从([{"中的字符开始的任何内容。

如果你需要更强大的东西,这会有一个更复杂的正则表达式,但它会确保开放标记匹配,并使最后一个表达式成为可选项。

def parse(text):
    m = re.search(r'(.*?)(?: ("[^"]*"|\([^)]*\)|\[[^]]*\]|\{[^}]*\}))?$', text)
    if not m:
        return None
    return m.group(1).split(), [m.group(2)]

答案 1 :(得分:2)

匹配与拆分

有一个简单的解决方案。关键是要理解匹配和分裂是同一枚硬币的两面。当你说“全部匹配”时,这意味着“拆分我不想匹配的东西”,反之亦然。我们将匹配,而不是拆分,你最终会得到相同的结果。

缩减版,简单版

让我们从正则表达式的最简单版本开始,这样你就不会被长篇大论吓到:

{[^{}]*}|\S+

这匹配第二个字符串的所有项目 - 就像我们分裂一样(参见demo

  • |替换的左侧与{braces}的完整集合相匹配。
  • |的右侧匹配任何不是空格字符的字符。

就这么简单!

完整正则表达式

我们还需要匹配"full quotes"(full parentheses)[full brackets]。没问题:我们只是将它们添加到交替中。为了清楚起见,我将它们放在一个非捕获组(?:中,以便\S+自行弹出,但没有必要。

(?:{[^{}]*}|"[^"]*"|\([^()]*\)|\[[^][]*\])|\S+

demo

备注潜在改进

  • 我们可以将引用的字符串正则表达式替换为接受转义引号
  • 的字符串
  • 我们可以用递归表达式替换括号,括号和括号表达式以允许嵌套构造,但是你必须使用Matthew Barnett(真棒)regex模块而不是re
  • 该技术与Match (or replace) a pattern except when...
  • 的简单而美妙的技巧有关

如果您有任何疑问,请告诉我们。

答案 2 :(得分:1)

也许这个链接会有所帮助:

Split a string by spaces -- preserving quoted substrings -- in Python

它解释了在用空格分割字符串时如何保留引用的子字符串。