Разделите строку пробелами — сохранение заключенных в кавычки подстрок — в Python

printf("\nEnter the value : ");
scanf("%s",a);
printf("\nEnter the value to be searched : ");
scanf("%d",&val);   // here is different

Я не знаю, почему, но код выше работает ...

scanf("%d",&val);
244
задан S.Lott 7 February 2009 в 22:46
поделиться

8 ответов

Вы хотите разделение, от модуль shlex .

>>> import shlex
>>> shlex.split('this is "a test"')
['this', 'is', 'a test']

Это должно сделать точно, что Вы хотите.

361
ответ дан Boris 4 November 2019 в 12:42
поделиться

Попробуйте это:

  def adamsplit(s):
    result = []
    inquotes = False
    for substring in s.split('"'):
      if not inquotes:
        result.extend(substring.split())
      else:
        result.append(substring)
      inquotes = not inquotes
    return result

Некоторые тестовые строки:

'This is "a test"' -> ['This', 'is', 'a test']
'"This is \'a test\'"' -> ["This is 'a test'"]
-2
ответ дан pjz 4 November 2019 в 12:42
поделиться

Если Вы не заботитесь о строках sub, чем простое

>>> 'a short sized string with spaces '.split()

Производительность:

>>> s = " ('a short sized string with spaces '*100).split() "
>>> t = timeit.Timer(stmt=s)
>>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
171.39 usec/pass

Или строковый модуль

>>> from string import split as stringsplit; 
>>> stringsplit('a short sized string with spaces '*100)

Производительность: Строковый модуль, кажется, работает лучше, чем строковые методы

>>> s = "stringsplit('a short sized string with spaces '*100)"
>>> t = timeit.Timer(s, "from string import split as stringsplit")
>>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
154.88 usec/pass

, Или можно использовать механизм РЕ

>>> from re import split as resplit
>>> regex = '\s+'
>>> medstring = 'a short sized string with spaces '*100
>>> resplit(regex, medstring)

Производительность

>>> s = "resplit(regex, medstring)"
>>> t = timeit.Timer(s, "from re import split as resplit; regex='\s+'; medstring='a short sized string with spaces '*100")
>>> print "%.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)
540.21 usec/pass

Для очень длинных строк, Вы не должны загружать всю строку в память и вместо этого или разделить строки или использовать итерационный цикл

-2
ответ дан Gregory 4 November 2019 в 12:42
поделиться

Так как этот вопрос отмечен с regex, я решил попробовать подход regex. Я сначала заменяю все пробелы в кавычках, расстается с \x00, затем разделенным пробелами, затем замените \x00 назад к пробелам в каждой части.

Обе версии делают то же самое, но разделитель более читаем тогда splitter2.

import re

s = 'this is "a test" some text "another test"'

def splitter(s):
    def replacer(m):
        return m.group(0).replace(" ", "\x00")
    parts = re.sub('".+?"', replacer, s).split()
    parts = [p.replace("\x00", " ") for p in parts]
    return parts

def splitter2(s):
    return [p.replace("\x00", " ") for p in re.sub('".+?"', lambda m: m.group(0).replace(" ", "\x00"), s).split()]

print splitter2(s)
7
ответ дан elifiner 4 November 2019 в 12:42
поделиться

В зависимости от Вашего варианта использования можно также хотеть проверить csv модуль:

import csv
lines = ['this is "a string"', 'and more "stuff"']
for row in csv.reader(lines, delimiter=" "):
    print row

Вывод:

['this', 'is', 'a string']
['and', 'more', 'stuff']
25
ответ дан Boris 4 November 2019 в 12:42
поделиться

Я вижу подходы regex здесь что комплекс взгляда и/или неправильно. Это удивляет меня, потому что regex синтаксис может легко описать "пробел или thing-surrounded-by-quotes", и большинство regex механизмов (включая Python) может разделить на regex. Таким образом, если Вы собираетесь использовать regexes, почему не просто говорят точно, что Вы имеете в виду?:

test = 'this is "a test"'  # or "this is 'a test'"
# pieces = [p for p in re.split("( |[\\\"'].*[\\\"'])", test) if p.strip()]
# From comments, use this:
pieces = [p for p in re.split("( |\\\".*?\\\"|'.*?')", test) if p.strip()]

Объяснение:

[\\\"'] = double-quote or single-quote
.* = anything
( |X) = space or X
.strip() = remove space and empty-string separators

shlex, вероятно, обеспечивает больше функций, все же.

36
ответ дан 4 November 2019 в 12:42
поделиться

Взгляните на shlex модуль, особенно shlex.split.

>>> import shlex
>>> shlex.split('This is "a test"')
['This', 'is', 'a test']
54
ответ дан Pavel Štěrba 4 November 2019 в 12:42
поделиться

HMM, не может находить кнопку «Ответить» ... В любом случае, этот ответ основан на подходе Kate, но правильно расщепляется строки с подстролами, содержащими скрепленные цитаты, а также удаляет начало и конечные цитаты Подстроки:

  [i.strip('"').strip("'") for i in re.split(r'(\s+|(?<!\\)".*?(?<!\\)"|(?<!\\)\'.*?(?<!\\)\')', string) if i.strip()]

Это работает на строках, такими как 'Это «A \\\» тест \\\ «\\\' S подстроки» (безумная разметка, к сожалению, необходима для того, чтобы держать Python от удаления побеги).

Если результирующие выбеги в строках в возвращенном списке не нужны, вы можете использовать эту слегка измененную версию функции:

[i.strip('"').strip("'").decode('string_escape') for i in re.split(r'(\s+|(?<!\\)".*?(?<!\\)"|(?<!\\)\'.*?(?<!\\)\')', string) if i.strip()]
1
ответ дан 23 November 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: