RegExp для строки с повторяющимися токенами - PullRequest
0 голосов
/ 08 ноября 2019

Однажды я овладею Regexp, но снова я застрял в модуле Python re. Когда я использовал ; в качестве конструкции регулярного выражения, он возвращает только ; символы, что немного смущает, если честно.

Я хочу разделить эту строку данных:

$POSL;VEL;GPS;040.0;0.1;;;*32

; - это разделитель, но важно, чтобы я получил пустых совпадений (нулевые строки) для элементов 6 и 7.

Итак,выходной сигнал, который мне требуется, будет:

  • "$POSL"
  • "VEL"
  • "GPS"
  • "040.0"
  • "0.1"
  • ""
  • ""
  • "*32"

Примечание: I 'Я знаю, что звонить split() будет проще. Но мне нужно знать индексы символов токенов - например, я знаю, что VEL занимает символы 6-8.

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

Это сработало для меня. Не требуется регулярное выражение.

inp = '$POSL;VEL;GPS;040.0;0.1;;;*32'
print(inp.split(';'))
1 голос
/ 08 ноября 2019

Регулярное выражение:

([^;]+|(?<=;)(?=;)|^(?=;)|(?<=;)$)

На входе:

;$POSL;VEL;GPS;040.0;0.1;;;*32;;

Дает:

Match 1
1.  Empty
Match 2
1.  $POSL
Match 3
1.  VEL
Match 4
1.  GPS
Match 5
1.  040.0
Match 6
1.  0.1
Match 7
1.  Empty
Match 8
1.  Empty
Match 9
1.  *32
Match 10
1.  Empty
Match 11
1.  Empty

https://regex101.com/r/HVrN1M/1

Но я думаю, что гораздо проще просто позвонить split.

0 голосов
/ 08 ноября 2019

re.split ('delimiter', string) -> первый аргумент - это разделитель, по которому вы хотите разбить строку, а 2-й аргумент - это строка, по которой вы хотите выполнить эту операцию.

Itвозвращает список строк и, следовательно, вы можете использовать по вашему желанию.

import re

#String s
s="$POSL;VEL;GPS;040.0;0.1;;;*32"

l=re.split(';',s)
print(l)

#['$POSL', 'VEL', 'GPS', '040.0', '0.1', '', '', '*32']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...