2014-09-06 5 views
0

Я пытаюсь разобрать следующий текст:Почему это регулярное выражение не возвращает желаемое совпадение?

data:{ 
       url: 'stage-player-stat' 
      }, 
      defaultParams: { 
       stageId: 9155, 
       teamId: 32, 
       playerId: -1, 
       field: 2 
      }, 

Использование Regex:

stagematch = re.compile('data:{url: \'ws-stage-stat\'},defaultParams: {},', re.S) 

Я не получаю матч, используя это, однако. Для меня это выглядит правильно. Может ли кто-нибудь сказать мне, где я ошибаюсь?

Благодаря

+7

это выглядит JSON-иш. .. вы действительно хотите обрабатывать его с помощью регулярных выражений? – andi

+0

@JakubJirutka Я давно не использовал Python, и я никогда раньше не использовал парсер JSON. – gdogg371

+1

@ user3045351 Ну, тогда вы должны сначала прочитать [this] (https://docs.python.org/3.4/library/json.html). –

ответ

1

Помимо глубокого вопроса разбора JSON с регулярным выражением, ваше регулярное выражение не допускает пустого пространства между компонентами, такими как «{» и «URL:», ни весь текст в defaultParams: {}.

И ваш URL-адрес регулярного выражения 'ws-stage-stat' не соответствует URL-адресу текста 'stage-player-stat'.

Следующие данные соответствуют совпадению ваших данных. (Использование сырого строкового литерала является общим для шаблонов регулярных выражений, чтобы избежать необходимости удвоить обратный слэш.)

stagematch = re.compile(
    r"data:\s*{\s*url:\s*'stage-player-stat'\s*},\s*defaultParams:\s*{.*},", 
    re.S) 
+1

Хотя библиотека, вероятно, будет использоваться, [это * не * JSON] (http://json.org). – user2864740

+0

@ jerry101 s, просто увлажняя меня на минуту, если вы положите re.M, вы можете написать Regex через несколько строк? – gdogg371

+3

Многострочный параметр изменяет значение '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', вот и все. –

0

Есть несколько причин, ваше регулярное выражение не возвращают нужный матч:

  1. Вашего регулярное выражение на самом деле не соответствует

    * ws-stage-statstage-player-stat, так что вы не получите матч.

    ** Также принимается во внимание non-word chars, multiple lines, или upper/lowercase.

  2. Использование match groups позволит вам захватить нужные части строки.

Непонятно, что вы пытаетесь сделать в любом случае. Как говорили другие, лучше было бы использовать библиотеку или конкретный синтаксический анализатор; Я не тот, кто защищает то или другое, но то, что работает.

Если вы хотите, чтобы соответствовать вашей строке (JSON?) С использованием регулярных выражений, хотя, в том числе других сайтов, то вы могли бы сделать что-то вроде:

p = re.compile(ur'\'(.*)\'|(\w+):\s(.+(?=[,])|.+\n)') 
list = re.findall(p, str) 
print(list) 

результата:

[(u'', u'url', u"'stage-player-stat'\n"), (u'', u'defaultParams', u'{\n'), (u'', u'stageId', u'9155'), (u'', u'teamId', u'32'), (u'', u'playerId', u'-1'), (u'', u'field', u'2\n'), (u'', u'url', u"'ws-stat'\n"), (u'', u'defaultParams', u'{\n'), (u'', u'stageId', u'9155'), (u'', u'teamId', u'32'), (u'', u'playerId', u'-1'), (u'', u'field', u'2\n'), (u'', u'stageId', u'9155'), (u'', u'teamId', u'32'), (u'', u'playerId', u'-1')] 
Смежные вопросы