Как правильно добавить кавычки в строку с помощью Python? - PullRequest
4 голосов
/ 27 августа 2010

Я хочу добавить набор (двойных) кавычек в строку Python, если они отсутствуют, но строка также может содержать кавычки.

Цель этого состоит в том, чтобы заключить в кавычки все команды, которые еще не были заключены в кавычкипоскольку Windows API требует заключать в кавычки всю командную строку при выполнении процесса с использованием _popen () .

Вот некоторые строки, которые должны быть в кавычках:

<empty string>
type
"type" /?
"type" "/?"
type "a a" b
type "" b

Вот некоторые из них, которые не должны быть указаны:

"type"
""type" /?"

Пожалуйста, найдите время, чтобы протестировал все примеры ;Нелегко определить, нужны ли строки в кавычках или нет.

Ответы [ 4 ]

8 голосов
/ 27 августа 2010

Ваша проблема противоречива.

Рассмотрим два случая

""a" b"

"a" "b"

Первыйинтерпретируется как предварительно заключенная в кавычки строка с «вложенными кавычками», но последняя интерпретируется как отдельно заключенные в кавычки строки.Вот несколько примеров, которые выдвигают на первый план проблему.

" "a" "b" "

" "a" b"

"a ""b"

Как следуетих лечили?

4 голосов
/ 27 августа 2010

Я думаю, что это сложный вопрос для точного определения, но, возможно, эта стратегия будет приближаться к вашей цели.

Основная идея заключается в создании копии исходной строки, удалив внутренне заключенных в кавычки элементов . Здесь определяется элемент, заключенный в кавычки, так что он должен содержать хотя бы один непробельный символ.

После удаления внутренних элементов в кавычках вы затем проверяете, нуждается ли вся строка в кавычках или нет.

import re

tests = [
    # Test data in original question.
    ( '',                '""'                ),
    ( 'a',               '"a"'               ),
    ( '"a"',             '"a"'               ), # No change.
    ( '""a" b"',         '""a" b"'           ), # No change.
    ( '"a" b',           '""a" b"'           ),
    ( '"a" "b"',         '""a" "b""'         ),
    ( 'a "b" c',         '"a "b" c"'         ),

    # Test data in latest edits.
    ( 'type',            '"type"'         ),    # Quote these.
    ( '"type" /?',       '""type" /?"'    ),
    ( '"type" "/?"',     '""type" "/?""'  ),
    ( 'type "a a" b',    '"type "a a" b"' ),
    ( 'type "" b',       '"type "" b"'    ),
    ( '"type"',          '"type"'         ),    # Don't quote.
    ( '""type" /?"',     '""type" /?"'    ),

    # Some more tests.
    ( '"a b" "c d"',     '""a b" "c d""'     ),
    ( '" a " foo " b "', '"" a " foo " b ""' ),
]

Q = '"'
re_quoted_items = re.compile(r'" \s* [^"\s] [^"]* \"', re.VERBOSE)

for orig, expected in tests:
    # The orig string w/o the internally quoted items.
    woqi = re_quoted_items.sub('', orig)

    if len(orig) == 0:
        orig_quoted = Q + orig + Q
    elif len(woqi) > 0 and not (woqi[0] == Q and woqi[-1] == Q):
        orig_quoted = Q + orig + Q    
    else:
        orig_quoted = orig

    print orig_quoted == expected
3 голосов
/ 27 августа 2010

Я написал простой конечный автомат, чтобы отслеживать, находимся ли мы в слове или нет.Если глубина строки в строке равна нулю, нам нужны кавычки:

def quotify(s):
    if s == "":
        return '""'

    depth = 0
    in_word = False
    needs_quotes = False
    for c in s:
        if c == '"':
            if in_word:
                depth -= 1
            else:
                depth += 1
        else:
            if depth == 0:
                needs_quotes = True
                break
            in_word = not c.isspace()

    if needs_quotes:
        return '"' + s + '"'
    else:
        return s

assert quotify('') == '""'
assert quotify('''type''') == '''"type"'''
assert quotify('''"type" /?''') == '''""type" /?"'''
assert quotify('''"type" "/?"''') == '''""type" "/?""'''
assert quotify('''type "a a" b''') == '''"type "a a" b"'''
assert quotify('''type "" b''') == '''"type "" b"'''
assert quotify('''"type"''') == '''"type"'''
assert quotify('''""type" /?"''') == '''""type" /?"'''
0 голосов
/ 27 августа 2010

У вас есть три случая:

  1. Строка длиной менее двух символов: добавить кавычки
  2. Строка имеет кавычки в s [0] и в s [1]: не добавлять кавычки
  3. Добавить цитаты

И под «добавить кавычки» я имею в виду просто построить «» + строка + '»и вернуть его.

Переведите на операторы if, и все готово.

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