python ошибка синтаксиса сгиба, не может разобрать d [0-9] + - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь разобрать этот список: d0,d1,d2,d3,....d456,d457....

Чтобы разобрать это в python -ply, я написал это как выражение:

t_DID                   =   r'[d][0-9]+'
t_DID                   =   r'd[0-9]+'
t_DID                   =   r'\d[0-9]+'

Но, это обеспечивает мне ошибка.

Когда я ввожу 1, это дает мне - ОТЛАДКА: root: Синтаксическая ошибка в '1'

И когда я ввожу d, это дает мне - ОТЛАДКА: root: синтаксическая ошибка в 'd'

Каким будет правильный токен для этого шаблона?

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 10 апреля 2020

Ни один из этих шаблонов не соответствует ни d, ни 1.

  • r'[d][0-9]+' и r'd[0-9]+' соответствует d, за которым следует хотя бы один ди git , Таким образом, они будут соответствовать d1 или d234, но они не будут совпадать с d, потому что за ним не следует di git, и они не будут совпадать с 1, потому что оно не начинается с d

  • r'\d[0-9]+' соответствует значению di git (\d), за которым следует по крайней мере еще один di git. Таким образом, он не будет совпадать ни с одной строкой, начинающейся с d, и не будет совпадать с 1, поскольку для этого требуется как минимум две цифры. Но оно будет соответствовать 12, 274 и 29847502948375029384750293485702938750493875.

. Вы можете прочитать о Python регулярных выражениях в Python документах ( \ escape-коды, включая \d, здесь ).

Создать интерактивный инструмент, который позволяет экспериментировать с Python регулярными выражениями, очень просто. Вот очень простой пример, который можно значительно улучшить:

$ python3
Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> import readline
>>> def try_regex(regex):
...   r = re.compile(regex)
...   try:
...     while True:
...       match = r.match(input('--> '))
...       if match:
...         print(f"Matched {match.end()} characters: {match[0]}")
...       else:
...         print("No match")
...   except EOFError:
...     pass
... 
>>> try_regex(r'd[0-9]+')
--> d1
Matched 2 characters: d1
--> d123
Matched 4 characters: d123
--> 1
No match
--> d
No match
--> d123 abc
Matched 4 characters: d123
--> d123abc
Matched 4 characters: d123


...