Необходимо ли в Python удаление строки с помощью '\ r \ n'? - PullRequest
0 голосов
/ 03 января 2019

В Java необходимо удалить с \r\n, например, split ("\ r \ n") не разбивает мою строку в java

Но нужно ли в Python \r\n? Верно ли следующее?

str.strip() == str.strip('\r\n ')

Из документов :

Возвращает копию строки с начальными и последними символами удален. Аргумент chars - это строка, определяющая набор символы для удаления. Если опущен или отсутствует, аргумент chars по умолчанию удаляет пробелы. Аргумент chars не является префиксом или суффикс; скорее все комбинации его значений обрезаны

Из этого теста CPython , str.strip(), кажется, зачистка:

 \t\n\r\f\v

Кто-нибудь может указать мне код в CPython, который выполняет очистку строки?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

По существу:

str.strip() == str.strip(string.whitespace) == str.strip(' \t\n\r\f\v') != str.strip('\r\n')

Если вы явно не пытаетесь удалить ТОЛЬКО символы новой строки, str.strip() и str.strip('\r\n') отличаются.

>>> '\nfoo\n'.strip()
'foo'
>>> '\nfoo\n'.strip('\r\n')
'foo'
>>> '\r\n\r\n\r\nfoo\r\n\r\n\r\n'.strip()
'foo'
>>> '\r\n\r\n\r\nfoo\r\n\r\n\r\n'.strip('\r\n')
'foo'
>>> '\n\tfoo\t\n'.strip()
'foo'
>>> '\n\tfoo\t\n'.strip('\r\n')
'\tfoo\t'

Все это выглядит нормально, но учтите, что если между новой строкой и началом или концом строки есть пробел (или любой другой символ), .strip('\r\n') не удалит символ новой строки.

>>> '\t\nfoo\n\t'.strip()
'foo'
>>> '\t\nfoo\n\t'.strip('\r\n')
'\t\nfoo\n\t'
0 голосов
/ 03 января 2019

Вы ищете эти строки?

https://github.com/python/cpython/blob/e42b705188271da108de42b55d9344642170aa2b/Objects/unicodeobject.c#L12222-L12247

#define LEFTSTRIP 0
#define RIGHTSTRIP 1
#define BOTHSTRIP 2

/* Arrays indexed by above */
static const char *stripfuncnames[] = {"lstrip", "rstrip", "strip"};

#define STRIPNAME(i) (stripfuncnames[i])

/* externally visible for str.strip(unicode) */
PyObject *
_PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj)
{
    void *data;
    int kind;
    Py_ssize_t i, j, len;
    BLOOM_MASK sepmask;
    Py_ssize_t seplen;

    if (PyUnicode_READY(self) == -1 || PyUnicode_READY(sepobj) == -1)
        return NULL;

    kind = PyUnicode_KIND(self);
    data = PyUnicode_DATA(self);
    len = PyUnicode_GET_LENGTH(self);
    seplen = PyUnicode_GET_LENGTH(sepobj);
    sepmask = make_bloom_mask(PyUnicode_KIND(sepobj),
                              PyUnicode_DATA(sepobj),
                              seplen);

    i = 0;
    if (striptype != RIGHTSTRIP) {
        while (i < len) {
            Py_UCS4 ch = PyUnicode_READ(kind, data, i);
            if (!BLOOM(sepmask, ch))
                break;
            if (PyUnicode_FindChar(sepobj, ch, 0, seplen, 1) < 0)
                break;
            i++;
        }
    }

    j = len;
    if (striptype != LEFTSTRIP) {
        j--;
        while (j >= i) {
            Py_UCS4 ch = PyUnicode_READ(kind, data, j);
            if (!BLOOM(sepmask, ch))
                break;
            if (PyUnicode_FindChar(sepobj, ch, 0, seplen, 1) < 0)
                break;
            j--;
        }

        j++;
    }

    return PyUnicode_Substring(self, i, j);
}
...