Python:从2个字符串中删除不相似的行

时间:2012-08-13 04:50:00

标签: python string

我正在使用Python来查看字符串A和字符串B.

字符串A只包含单词(每个单词在其自己的行上都有\ n换行符)。

接下来,我有字符串B,其中包含许多单词,其中一些在字符串A中找到,而另一些则在字符串A中找不到。我想只保留字符串B中也在字符串A中的单词。这里唯一的问题是字符串B中的单词之后还有其他字符,我也想保留。

示例:

String_A='apple/nbanana/nkiwi/npear'
String_B='cow|0.0|0.25|apple|0.0|0.99|pig|0.0|horse|0.2|banana|0.0|dog|0.2|kiwi|0.25|'

我希望String_C的结束格式为:

String_C='apple|0.0|0.99|banana|0.0|kiwi|0.25|'

请看看你是否可以提供协助!感谢。

4 个答案:

答案 0 :(得分:0)

如果在StringB中的每个单词后面总是有两个组,则可以执行以下操作

def foo(stringA, stringB):
    sawords = frozenset(stringA.split('\n'))
    sbparts = stringB.split('|')
    sbgroups = [sbparts[i:i+3] for i in range(len(sbparts))[::3]]
    filtered = [group for group in sbgroups if group[0] in sawords]
    return '|'.join(itertools.chain(*filtered))

答案 1 :(得分:0)

这不是更好的实现,但它有效

a = String_A.split('\n')
b = String_B.split('|')
c = []
for i in a:
    try:
        found = b.index(i)
        c.append(b[found])
        found += 1
        while found < len(b) and all(map(str.isdigit, (i for i in b[found] if i != '.-'))):
            c.append(b[found])
            found += 1
    except ValueError:
        pass
c = '|'.join(c)

答案 2 :(得分:0)

这种方法忽略了名称字段,因为它们可以包含小数,“ - ”和“。”,只要它还包含其他内容。相反,此函数使用re模块来测试非名称字段。如果要允许非名称字段中的其他字符,可以修改正则表达式。我对String_B进行了一些更改,以检查其他非十进制字符类型。

import re
import itertools

def filter_strings(stra, strb):
    splita = stra.split("\n")
    splitb = strb.split("|")
    bnestlist = []
    sublist = []

    for segment in splitb:
        if re.match("[\d\.-]+", segment):
            sublist.append(segment)
        else:
            if sublist: bnestlist.append(sublist)
            sublist = []
            sublist.append(segment)

    filtered = [group for group in bnestlist if group[0] in splita]
    return "|".join(itertools.chain.from_iterable(filtered))

示例:

>>> String_A='apple\nbanana\nkiwi\npear'
>>> String_B='cow|0.0|0.25|apple|0.0|-0.99|pig|0.0|horse|0.2|banana|0.0|dog|0.2|kiwi|0.25|'
>>> result = filter_strings(String_A, String_B)
>>> print(result)
apple|0.0|-0.99|banana|0.0|kiwi|0.25

答案 3 :(得分:0)

'|'.join([elem for elem in String_A.split('/') if elem in String_B.split('|')])