Как мне удалить \ n знаки между двойными кавычками из строки? - PullRequest
2 голосов
/ 20 июля 2011

Добрый день,

Я совершенно новичок в Python и пытаюсь что-то сделать со строкой.

Я хотел бы удалить любые \n символы, найденные между двойными кавычками (") только , из заданной строки:

str = "foo,bar,\n\"hihi\",\"hi\nhi\""

Желаемый результат должен быть:

foo,bar
"hihi", "hihi"

Edit:

Требуемый вывод должен быть похож на эту строку: after = "foo,bar,\n\"hihi\",\"hihi\""

Какие-нибудь советы?

Ответы [ 6 ]

3 голосов
/ 20 июля 2011

Простой фильтр с сохранением состояния сделает свое дело.

in_string  = False
input_str  = 'foo,bar,\n"hihi","hi\nhi"'
output_str = ''

for ch in input_str:
    if ch == '"': in_string = not in_string
    if ch == '\n' and in_string: continue
    output_str += ch

print output_str
3 голосов
/ 20 июля 2011

Это должно сделать:

def removenewlines(s):
    inquotes = False
    result = []

    for chunk in s.split("\""):
        if inquotes: chunk.replace("\n", "")
        result.append(chunk)
        inquotes = not inquotes

    return "\"".join(result)
2 голосов
/ 20 июля 2011

Краткое примечание: строки Python могут использовать '' или "" в качестве разделителей, поэтому обычно для удобства чтения одну из них следует использовать, когда другая находится внутри вашей строки.Например: 'foo,bar,\n"hihi","hi\nhi"'.К вопросу ...

Возможно, вам нужен модуль регулярного выражения python: re .В частности, здесь вам нужна функция подстановки.Есть множество способов сделать это, но один быстрый вариант - использовать регулярное выражение, которое идентифицирует подстроки "", а затем вызывает вспомогательную функцию, чтобы удалить из них любые \n ...

import re
def helper(match):
    return match.group().replace("\n","")
input = 'foo,bar,\n"hihi","hi\nhi"'
result = re.sub('(".*?")', helper, input, flags=re.S)
2 голосов
/ 20 июля 2011
>>> str = "foo,bar,\n\"hihi\",\"hi\nhi\""
>>> re.sub(r'".*?"', lambda x: x.group(0).replace('\n',''), str, flags=re.S)
'foo,bar,\n"hihi","hihi"'
>>>

Краткое объяснение:

  1. re.sub - это механизм замещения.Он принимает регулярное выражение, функцию подстановки или выражение, строку для работы и другие параметры.
  2. Регулярное выражение ". *?"ловит строки в двойных кавычках, которые сами по себе не содержат других двойных кавычек (есть небольшая ошибка, потому что она не будет ловить строки, содержащие экранированные двойные кавычки).выражение, которое может использоваться везде, где может использоваться функция.
  3. Механизм замещения вызывает функцию с объектом соответствия.x.group (0) - это "вся совпадающая строка", которая также включает двойные кавычки.x.group (0) - это совпадающая строка с заменой '\ n' на ''.
  4. Флаг re.S сообщает re.sub, что \ n является допустимым символом, который нужно поймать точкой.

Лично я нахожу более длинные функции, которые говорят то же самое, более утомительными и менее читаемыми, так же, как в CI предпочли бы от i++ до i = i + 1.Это все о том, что каждый привык читать.

1 голос
/ 20 июля 2011

Это регулярное выражение работает (при условии, что кавычки правильно сбалансированы):

import re
result = re.sub(r"""(?x) # verbose regex
    \n        # Match a newline
    (?!       # only if it is not followed by
     (?: 
      [^"]*"  # an even number of quotes
      [^"]*"  # (and any other non-quote characters)
     )*       # (yes, zero counts, too)
     [^"]*
     \z       # until the end of the string.
    )""", 
    "", str)
0 голосов
/ 20 июля 2011

Примерно так

Разбейте данные CSV на столбцы.

>>> m=re.findall(r'(".*?"|[^"]*?)(,\s*|\Z)',s,re.M|re.S)
>>> m
[('foo', ','), ('bar', ',\n'), ('"hihi"', ','), ('"hi\nhi"', ''), ('', '')]

Замените только экземпляры полей '\ n' на ''.

>>> [ field.replace('\n','') + sep for field,sep in m ]
['foo,', 'bar,\n', '"hihi",', '"hihi"', '']

Соберите полученный материал (если это действительно так.)

>>> "".join(_)
'foo,bar,\n"hihi","hihi"'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...