2015-02-21 3 views
-1

"" " Это дает то, что мне нужно, но мне нужно сделать то же самое, не используя split. Наш профессор только научил нас, как использовать split и strip, но он хочет, чтобы мы не использовать раскол «»»Я пытаюсь разделить строки без использования split

def main(): 
    textFileName= input('file name') 
    countWords(textFileName) 

def countWords(textFileName): 
     file=open(textFileName) 
     count=[] 
     for line in open (textFileName): 

       count.extend(line.split()) 

     print(count) 
     print(len(count)) 

main() 
+0

Посмотрите на http://codereview.stackexchange.com/questions/47627/is-this-a-good-implementation-of-the-split-функцию для разных способов реализации 'split' :) –

ответ

2

используйте re.findall функцию.

count.extend(re.findall(r'\S+', line)) 

\S+ соответствует одному или нескольким непространственным символам.

Пример:

>>> s = "foo bar buzz" 
>>> s.split() 
['foo', 'bar', 'buzz'] 
>>> re.findall(r'\S+', s) 
['foo', 'bar', 'buzz'] 
0

Вы можете использовать itertools.groupby для этой цели. Если ваш профессор имеет опыт работы в функциональных языках, он, несомненно, оценят:

>>> import itertools 
>>> line = "abc def ghi" 

>>> ["".join(token) 
    for space, token in itertools.groupby(line, key=lambda c: c.isspace()) 
    if not space] 
# ^^^^^^^^^^^^        ^^^^^^^^^^^^^^^^^^^^^^^^^ 
# keep only non         group together 
# space sequences         consecutive chars 
# in the result         based on the result 
#             of `isspace` 

['abc', 'def', 'ghi'] 
0

Вы могли бы сделать метод пользовательского разделения:

class Str(str): 
    def split(self, sep=None, maxsplit=-1): 
     if sep is not None and len(sep) != 1: 
      return NotImplemented # Can't figure out how to do seps longer than 1... 
     whole = [] 
     curr = [] 
     for i in self: 
      if i not in (sep or "\n \t"): 
       curr.append(i) 
      elif curr != []: 
       whole.append("".join(curr)) 
       curr = [] 
     whole.append("".join(curr)) 
     if sep is None: 
      whole = [i for i in whole if i != ""] 
     if maxsplit > -1: 
      whole[maxsplit:] = ["".join(whole[maxsplit])] 
     return whole 

Затем используйте это нравится:

my_str = Str("Hello, How are you, List Item here, Index blah, Gonna split") 
print(my_str.split()) 
# Output: 
['Hello,', 'How', 'are', 'you,', 'List', 'Item', 'here,', 'Index', 'blah,', 'Gonna', 'split'] 

Вы может сделать это функцией, если не является классом:

def split(str_to_split, sep=None, max_split=-1): 
    if sep is not None and len(sep) != 1: 
     return NotImplemented 
    whole = [] 
    curr = [] 
    for i in str_to_split: 
     if i not in (sep or "\n \t"): 
      curr.append(i) 
     elif curr != []: 
      whole.append("".join(curr)) 
      curr = [] 
    whole.append("".join(curr)) 
    if sep is None: 
     whole = [i for i in whole if i != ""] 
    if maxsplit > -1: 
     whole[maxsplit:] = ["".join(whole[maxsplit])] 
    return whole 
0

Обучение использованию регулярных выражений будет очень, очень, очень полезным, поэтому обязательно попробуйте и поймите пример Авинаша. И itertools - очень мощная библиотека.

Еще одна возможность заключается в том "".partition()

s = "foo bar fizz buzz" 
l = [] 

while True: 
    res = s.partition(' ') 
    l.append(res[0]) 
    if not res[2]: 
     break 
    s = res[2] 

for w in l: 
    print w 

Это может быть расширена, чтобы сделать больше, чем одну строку.

Смежные вопросы