В Python: как мне сказать: если line.partition ('#' или 'tab') ... сделать что-нибудь - PullRequest
3 голосов
/ 11 ноября 2009

В Python: как мне сказать:

line = line.partition('#' or 'tab')[0]   ... do something with 

Я знаю, что могу сделать:

line = line.partition('#')[0]  ... do something

Но каков код символа табуляции, и могу ли я сказать # или табуляцию?

Обновление: я пытаюсь сказать, прочитайте первое слово в каждой строке, если вы читаете знак #, тогда игнорируйте все после этого символа (так как это комментарий). Но потом я обнаружил, что если бы в файле было первое слово tab, то оно считывало бы вкладку как часть первого слова. Поэтому я пытался сказать, что если вы читаете вкладку или хэш, то рассматривайте строку как комментарий. Обходной путь - просто поставить пробел после первого слова, а не табуляцию. Но это не очень элегантно. Теперь я понимаю, что если утверждение было неверным, я пытался слишком упростить вещи. Выше теперь правильно, но я думаю, что путь Неда Батчелдера - это то, что нужно, но теперь, возможно, есть кое-что еще, когда вы знаете, что я пытаюсь сделать.

Ответы [ 4 ]

10 голосов
/ 11 ноября 2009

раздел не допускает опций, поэтому вам может понадобиться re.split:

re.split("(#|\t)", line, 1)

re.split обладает интересным свойством: если шаблон заключен в скобки, то в результатах возвращается разделитель, и вы можете использовать maxsplit (как я здесь установил в 1). Это вернет тройку, похожую на раздел.

Но вы тестируете возвращаемое значение раздела, которое всегда True, поэтому я не уверен, что вы пытаетесь получить ...

2 голосов
/ 11 ноября 2009

Поскольку комментарий от # до конца строки, мы обычно делаем следующее:

raw_data, _, _ = line.partition("#")
data= raw_data.strip()
if len(data) == 0:
    continue # or whatever, the data part of the line is empty
# you have data 

Смысл в том, чтобы не пытаться совмещать обработку комментариев с разбором пробелов.

[raw_data, _, _ = line.partition("#") сохранит деталь перед "#" в raw_data, сохранит "#" в переменной с именем _. Он также сохранит часть после «#» в переменной с именем _. Мы просто проигнорируем переменную с именем _, поэтому нам все равно, какое значение она имеет.]

Вы также можете сделать это

data, _, _ = line.strip().partition("#")

Это не общее решение, потому что иногда этот пробел перед комментарием имеет смысл.

2 голосов
/ 11 ноября 2009

'\t' - строка, содержащая вкладку.

import re

match = re.search('[#\t]', line)
if match:
    i, j = match.span()
    return (line[:i], line[i:j], line[j:])
return (line, '', '')

Это даст результаты, аналогичные разделу: кортеж (head, sep, tail).

0 голосов
/ 04 мая 2014

Я бы сначала разделил строку на три части с разделением для #, а затем снова для '\ t'.

Что можно сделать (с разделом, как указано выше):

first_word, space, rest = Line.partition ('\ t')

теперь в first_word у вас есть разделение на части для \ t (вкладка). Однако вы можете дополнительно разделить это на случай, если есть что-то еще, например #. Пример:

first_word_2, s_2, r_2 = first_word.partition ('#')

Теперь в first_word_2 у вас должно быть то, что вы хотите.

S

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...