2012-08-13 51 views
0

我使用Python来看看字符串A和B.字符串的Python:从2串删除异种线

String一个只包含单词(含\ n换行字符作为每个字是自己的行)。

接下来,我有字符串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|' 

我想String_C拥有的一端格式:

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

请看看你是否能帮助!谢谢。

+0

你的期望的输出是模糊的。如果单词包含数字或| s,该怎么办? – Antimony 2012-08-13 04:52:16

+0

@Antimony:根据我对文本文件的了解,单词将永远不会包含数字或字符。唯一的特殊字符是'|'和'。'符号。 – Levar 2012-08-13 05:00:20

+0

@Blender:我从python.re开始,但找不到一种既能删除不需要的字符又能保留相同字符(如果它们落在所需字词后面)的有用方法。 – Levar 2012-08-13 05:02:03

回答

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

不幸的是,在每个单词后面并不总是有两个组String_B – Levar 2012-08-13 05:02:52

+0

那么问题就是病态。额外的字符总是会是数字吗? – Antimony 2012-08-13 05:07:36

+0

单词之间的字符将始终为('|','。',' - ')中数字或特殊字符的类型。没有进一步的偏离。如果示例代码无法捕捉到这些细微差别,我们深表歉意。 – Levar 2012-08-13 05:13:10

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) 
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 
0
'|'.join([elem for elem in String_A.split('/') if elem in String_B.split('|')])