在python中删除字符midstring(iterable)

时间:2012-01-18 00:35:22

标签: python python-3.x

我有一长串字符串,其中包含4条信息。我通过在空白处拆分它们来索引它们。不幸的是,在一些字符串中,第二条信息中也有一个空格。我希望能够删除两个冒号之间发生的任何空格。这里列出了一些项目来展示:

  国外a:at:n请求1

     国外a:at:n沉默1

     国外a:at:n time 6

     国外a:因为:n schedule 1

     国外a:by:n american 1

     国外a:by:n bank 1

     国外a:by:n blow 1

所以,我的问题出现在上面的第4行。显然我可以手动删除空间来解决问题,但列表是数千行。此外,我可以编写代码替换任何出现的“因为”和“因为”,但这不是唯一发生的两个单词序列。另外,第三个切片有时包含“因为”,我想保留那里的空白。我当前的代码试图返回每个序列的频率,如下所示:

import sys
import pprint

occ_list = []
observed = {}

lines = sys.stdin.readlines()

for line in lines:
    l = line.strip()
    i = l.split(' ')
    word = i[0]
    rel = i[1]
    wirts = i[2:-1]
    wirt = ' '.join(wirts)  # Word-in-relation-to (which may be compund)
    occ = i[-1]             # Frequency of specific "word, rel, wirt"
    arb = (word, rel, wirt)
    occ_list.append(int(occ))

    if not arb in observed.keys():
            observed[arb] = []
    if not occ in observed[arb]:
            observed[arb].append(int(occ)/float(1064542))

pprint.pprint(observed)

除上述具有额外空格的行外,这是有效的。

我很感激任何建议。 (我使用的是python 3.2) 感谢

4 个答案:

答案 0 :(得分:1)

首先在空格处分割。如果第二项包含空格,那么其中应该有2个冒号;如果只有一个冒号,则第二个项目中的 空白,因此第二个和第三个项目是单个项目的一部分。

parts = line.split()
if parts[1].count(":") == 1:
    parts[1 : 3] = [" ".join(parts[1 : 3])]

答案 1 :(得分:0)

除了第二位信息之外,您是否期望文本文件中有冒号?如果不是,我建议拆分冒号以删除空格。如果您想在其他信息中允许其他冒号,那么我建议您使用re (regex)模块。

# Split on colons:
bits = l.split(':')
# remove spaces in the second part
bits[1] = bits[1].replace(' ','')
# join again
l = ':'.join(bits)
# do rest of code.

另外,你在我提出的问题中暗示了这一点,但我想澄清一下。你有这样的台词吗?

abroad a:by:because of american 1

在这种情况下,您希望rel成为a:by:because of吗?

信息第3部分(wirts)可以是多个单词吗?怎么样:

abroad a:by:because of american silence 2

你如何找出属于哪个词?

我认为在这种情况下,您需要在a:by:xxxx中使用包含空格的字词词典。

答案 2 :(得分:0)

使用正则表达式:

#!/usr/bin/env python
import fileinput
import re
from collections import defaultdict
from pprint import pprint

occ_list = []
observed = defaultdict(list)
for line in fileinput.input():
    m = re.search(r"(\S+)\s+([^:]+:[^:]+:\S+)\s+(\S+)\s+(\d+)", line)
    if m:
       word, rel, wirt, occ = m.groups()
       occ = int(occ)
       occ_list.append(occ)
       observed[word, rel, wirt].append(occ / 1064542.0)

pprint(occ_list)
pprint(dict(observed))

Output

[1, 1, 6, 1, 1, 1, 1]
{('abroad', 'a:at:n', 'request'): [9.393711098293914e-07],
 ('abroad', 'a:at:n', 'silence'): [9.393711098293914e-07],
 ('abroad', 'a:at:n', 'time'): [5.636226658976349e-06],
 ('abroad', 'a:because of:n', 'schedule'): [9.393711098293914e-07],
 ('abroad', 'a:by:n', 'american'): [9.393711098293914e-07],
 ('abroad', 'a:by:n', 'bank'): [9.393711098293914e-07],
 ('abroad', 'a:by:n', 'blow'): [9.393711098293914e-07]}

答案 3 :(得分:0)

这是仅使用splitrsplit的版本:

for line in lines:
    word, s = line.strip().split(' ', 1)
    s, occ = s.rsplit(' ', 1)
    rel, s = s.rsplit(':', 1)
    s, wirt = s.split(' ', 1)       
    arb = (word, rel + ':' + s, wirt)
    occ_list.append(int(occ))