Python Regex Split странным образом взаимодействует - PullRequest
0 голосов
/ 30 сентября 2018

Я выполняю задание по формальным языкам, и у меня возникли проблемы с попыткой разобраться с Python Regex, используя regex.split(param)

У меня следующий текст:

{q0,q1,q2,q3},{a,b},q0,{q1,q3}

Который должен быть разделен на:

["q0,q1,q2,q3", "a,b", "q0", "q1,q3"]

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

Для достижениявыше разделения я создал этот невероятно длинный кусок кода, имеющий дело с String.join() и Array.split():

[x for x in ' '.join(' '.join(' '.join(args.split(',{')).split('}')).split('{')).split(' ') if x != '']

Я попробовал следующее с REGEX, но оно просто не работает:

re.compile("(,{)|}|{|(},)")

Он возвращает мне:

['', None, None, 'q0,q1,q2,q3', None, None, '', ',{', None, 'a,b', None, None, ',q0', ',{', None, 'q1,q3', None, None, '']

Все эти ложные значения легко позаботиться, но почему он хранит такие вещи, как ,{ в массиве?

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Регулярное выражение будет находить что-либо между внешними запятыми, а затем я удаляю это из фигурных скобок, если они существуют:

import re
s = '{q0,q1,q2,q3},{a,b},q0,{q1,q3}'
result = [i[1:-1] if i.startswith('{') else i for i in re.findall(r'[^,{]*(?:\{[^{}]*\})*[^,}]*', s) if i]
print(result)  # ['q0,q1,q2,q3', 'a,b', 'q0', 'q1,q3']

Это также будет работать для других символов, кроме букв ASCII:

import re
s = '{q0,q1,q2,q3.?!},{a,b},q0,@,{q1,q3}'
result = [i[1:-1] if i.startswith('{') else i for i in re.findall(r'[^,{]*(?:\{[^{}]*\})*[^,}]*', s) if i]
print(result)  # ['q0,q1,q2,q3.?!', 'a,b', 'q0', '@', 'q1,q3']
0 голосов
/ 30 сентября 2018

Вы можете получить желаемое сразу с помощью простого re.findall.При желании повторите символы слова, за которыми следуют запятые в группе, затем добавьте еще несколько слов:

str = '{q0,q1,q2,q3},{a,b},q0,{q1,q3}'
re.findall(r'(?:\w+,)*\w+', str)

Вывод:

['q0,q1,q2,q3', 'a,b', 'q0', 'q1,q3']
0 голосов
/ 30 сентября 2018

используйте следующее регулярное выражение:

import re

s = "{q0,q1,q2,q3},{a,b},q0,{q1,q3}"
m = re.findall(r"\{([A-Za-z0-9_,]+)\}|,([A-Za-z0-9_]+),", s)
if m:
    print(m)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...