0

Python を使用して文字列 A と文字列 B を調べています。

文字列 A には単語のみが含まれます (各単語が独自の行にあるため、\n 改行文字が含まれます)。

次に、多くの単語を含む文字列 B があります。文字列 A にある単語とそうでない単語があります。文字列 A にもある文字列 B の単語のみを保持したいと思います。ここでの唯一の問題は、文字列 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

4 に答える 4

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)
于 2012-08-13T05:23:17.480 に答える
0

StringB の各単語の後に常に正確に 2 つのグループがある場合は、次のことができます。

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))
于 2012-08-13T04:54:51.830 に答える
0

このアプローチでは、名前フィールドは、10 進数、「-」、および「.」を含むことができる限り無視されます。代わりに、この関数は re モジュールを使用して名前以外のフィールドをテストします。名前以外のフィールドで他の文字を許可する場合は、正規表現を変更できます。String_B にいくつかの変更を加えて、他の非 10 進文字タイプをチェックしました。

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
于 2012-08-13T07:56:32.520 に答える
0
'|'.join([elem for elem in String_A.split('/') if elem in String_B.split('|')])
于 2012-08-13T08:14:38.783 に答える