Python:从两个字符串中删除不同的行

2024-06-25 23:50:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python来研究字符串A和字符串B

字符串A只包含单词(每个单词都在自己的行上,因此使用换行符)。你知道吗

接下来,我有字符串B,它包含了很多单词,有些可以在字符串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|'

我希望字符串\u C的结束格式为:

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

请看你是否能帮忙!谢谢。你知道吗


Tags: 字符串示例applestring字符单词banana行上
3条回答

如果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))

这种方法忽略名称字段,因为它们可以包含小数、“-”和“.”,只要它还包含其他内容。相反,此函数使用re模块测试非名称字段。如果希望在非名称字段中允许其他字符,可以修改regex。我对字符串\u 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

这不是更好的实现,但它起了作用

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)

相关问题 更多 >