Разделение на пробелы, кроме определенных символов - PullRequest
3 голосов
/ 10 марта 2012

Я анализирую файл с такими строками, как

type("book") title("golden apples") pages(10-35 70 200-234) comments("good read")

И я хочу разбить его на отдельные поля.

В моем примере есть четыре поля: тип, заголовок, pages и comments.

Желаемый результат после разбиения:

['type("book")', 'title("golden apples")', 'pages(10-35 70 200-234)', 'comments("good read")]

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

Как я могу разбить это?

Ответы [ 3 ]

13 голосов
/ 10 марта 2012

Это регулярное выражение должно работать для вас \s+(?=[^()]*(?:\(|$))

result = re.split(r"\s+(?=[^()]*(?:\(|$))", subject)

Объяснение

r"""
\s             # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks)
   +              # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
(?=            # Assert that the regex below can be matched, starting at this position (positive lookahead)
   [^()]          # Match a single character NOT present in the list “()”
      *              # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   (?:              # Match the regular expression below
                     # Match either the regular expression below (attempting the next alternative only if this one fails)
         \(             # Match the character “(” literally
      |              # Or match regular expression number 2 below (the entire group fails if this one fails to match)
         $              # Assert position at the end of a line (at the end of the string or before a line break character)
   )
)
"""
2 голосов
/ 10 марта 2012

Разделить на ") " и добавить ) обратно к каждому элементу, кроме последнего.

1 голос
/ 10 марта 2012

Я бы попробовал использовать положительное утверждение.

r'(?<=\))\s+'

Пример:

>>> import re
>>> result = re.split(r'(?<=\))\s+', 'type("book") title("golden apples") pages(10-35 70 200-234) comments("good read")')
>>> result
['type("book")', 'title("golden apples")', 'pages(10-35 70 200-234)', 'comments(
"good read")']
...