以更具体的方式解析字符串?

时间:2013-11-05 21:31:11

标签: python string parsing python-2.7 string-parsing

对于给定的输入字符串input = "abbbbdeeefffddddb",我想将其解析为

result = ['a', 'b', 'bb', 'bd', 'd', 'e', 'ee', 'f', 'ff', 'dd', 'db']

此解析背后的逻辑如下。如果第一次遇到子字符串,则会将其解析掉。在每个后续出现的子字符串中,它都会用以下字母连接起来然后解析掉。

举例说明:

  1. 我们之前看过“a”(位置0)了吗?不解析它。
  2. 我们之前见过“b”(位置1)吗?不解析它。
  3. 我们之前看过“b”(位置2)了吗?是;合并以下信件
  4. 我们之前看过“bb”(位置2和3)吗?不解析它。
  5. 我们之前见过“b”(位置4)吗?是合并以下信件
  6. 我们之前看过“bd”(位置4和5)吗?不解析它......
  7. 这一直持续到最后。

    我尝试使用以下代码实现此目的:

    input = "abbbbdeeefffddddb"
    
    comparator = []
    
    def parse(string):
        for pointer in range(len(string)-1):
            if string[pointer] not in comparator:
                comparator.append(string[pointer])
    
            else:
                substring = string[pointer] + string[pointer+1]
                comparator.append(substring)
    
            print comparator 
    
    parse(input)
    

    结果如下:['a', 'b', 'bb', 'bb', 'bd', 'd', 'e', 'ee', 'ef', 'f', 'ff', 'fd', 'dd', 'dd', 'dd', 'db']

    这是错的。我在这里错过了一个关键部分,但我不知道如何实现它,也许它需要一些递归函数,或者我应该在某处使用breakcontinue

    不要仅为此给定输入提供解决方案。这里给出的输入仅仅是为了举例。解决方案也必须适用于不同的输入。

    以下是原始算法,第6页:paper

3 个答案:

答案 0 :(得分:2)

你似乎忘记了从bigrams中删除已解析的字母:

def parse(string):
    pointer = 0
    while pointer < len(string):
        if string[pointer] not in comparator:
            comparator.append(string[pointer])
        else:
            substring = string[pointer] + string[pointer+1]
            comparator.append(substring)
            pointer += 1
        pointer += 1
    print comparator
['a', 'b', 'bb', 'bd', 'e', 'ee', 'f', 'ff', 'd', 'dd', 'db']

或略有改写

def parse(string):
    result = set()
    letters = iter(string)
    for letter in letters:
        if letter not in result:
            result.add(letter)
        else:
            substring = letter + letters.next()
            result.add(substring)
    return list(result)
# same set, different order
['a', 'bd', 'b', 'e', 'd', 'bb', 'f', 'ee', 'dd', 'db', 'ff'] 

答案 1 :(得分:2)

这是关于你想要的吗?

$ cat single-seen-double
#!/usr/bin/python3

def single_seen_double(string):
    length = len(string)
    index = 0
    seen = set()
    while index < length:
        if string[index] in seen and index < length - 1:
            yield string[index:index+2]
            index += 2
        else:
            seen.add(string[index])
            yield string[index]
            index += 1

def main():
    print(list(single_seen_double("abbbbdeeefffddddb")))

main()

zareason-dstromberg:~/src/outside-questions/single-seen-double x86_64-pc-linux-gnu 5871 - above cmd done 2013 Tue Nov 05 01:48 PM

$ ./single-seen-double
['a', 'b', 'bb', 'bd', 'e', 'ee', 'f', 'ff', 'd', 'dd', 'db']

它并没有提供你的样本输出,但我想知道这是不是你真正想要的。如果它不是您所需要的,您是否可以更具体地了解您需要遵循的规则?

答案 2 :(得分:0)

使用set?

有什么问题

set(comparator)

如果订单不重要。