Разбор строки, разделенной новой строкой, когда включены пробелы - PullRequest
1 голос
/ 22 апреля 2019

Я использую действительно аккуратную библиотеку Parsy , чтобы разделить строку (как часть большего определения грамматики). Sep_by прекрасно работает, когда нет встроенных пробелов. В основном я хочу разделить на новую строку и получить все символы, включая встроенные пробелы или любой другой символ Unicode. Примеры:

работает:

>>> parser = letter.at_least(1).concat().sep_by(string('\n'))
>>> parser.parse('Smith\nFirefighter')
['Smith', 'Firefighter']

не работает:

>>> parser.parse('John Smith\nFire fighter')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\code\Parsing\Parsing\env\lib\site-packages\parsy\__init__.py", line 90, in parse
    (result, _) = (self << eof).parse_partial(stream)
  File "C:\code\Parsing\Parsing\env\lib\site-packages\parsy\__init__.py", line 104, in parse_partial
    raise ParseError(result.expected, stream, result.furthest)
parsy.ParseError: expected one of 'EOF', '\n', 'a letter' at 0:4

Я также хотел бы прочитать любой встроенный символ Unicode, например, этот шахматный символ:

>>> parser.parse('hello\u265ethere\nsir')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\code\Parsing\Parsing\env\lib\site-packages\parsy\__init__.py", line 90, in parse
    (result, _) = (self << eof).parse_partial(stream)
  File "C:\code\Parsing\Parsing\env\lib\site-packages\parsy\__init__.py", line 104, in parse_partial
    raise ParseError(result.expected, stream, result.furthest)
parsy.ParseError: expected one of 'EOF', '\n', 'a letter' at 0:5

Любое понимание будет с благодарностью. Благодарю. Также может кто-то с большей репутацией создать тег parsy?

1 Ответ

0 голосов
/ 25 апреля 2019

Проблемы с решениями до сих пор:

  • letter соответствует только буквенным символам, но не всем символам
  • whitespace соответствует любому пробелу, поэтому, если вы сделаете letter | whitespace, тобудет использовать новую строку вместо разделения на нее.

По сути, вам нужен парсер «любой символ, кроме новой строки».Самый простой способ сделать это с помощью регулярных выражений:

>>> parser = regex(r"[^\n]+").sep_by(string('\n'))
>>> parser.parse("John Smith\nFirefigher")
['John Smith', 'Firefigher']

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

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