Регулярное выражение (Python) для извлечения строк текста из <и> - например, <stringone>так далее - PullRequest
1 голос
/ 14 сентября 2010

В настоящее время я играю с дампами данных переполнения стека и пытаюсь создать (как я себе представляю) простое регулярное выражение для извлечения имен тегов из символов < и >. Итак, для каждого вопроса у меня есть список из одного или нескольких тегов, таких как <tagone><tag-two>...<tag-n>, и я пытаюсь извлечь только список имен тегов. Вот несколько примеров строк тегов, взятых из дампа данных:

<javascript><internet-explorer>

<c#><windows><best-practices><winforms><windows-services>

<c><algorithm><sorting><word>

<java>

Для справки, мне не нужно делить имена тегов на слова, поэтому для примеров вроде <best-practices> я бы хотел получить best-practices (не best и practices) , Кроме того, что бы это ни стоило, я использую Python, если это имеет какое-то значение. Есть предложения?

Ответы [ 3 ]

3 голосов
/ 14 сентября 2010

Вместо создания дампов данных (какими бы они ни были) и использования регулярных выражений, вас может заинтересовать использование Stackoverflow API и json.

Например, чтобы отбирать теги изэтот вопрос, вы могли бы сделать это:

import urllib2
import json
import gzip
import cStringIO

f=urllib2.urlopen('http://api.stackoverflow.com/1.0/questions/3708418?type=jsontext')
g=gzip.GzipFile(fileobj=cStringIO.StringIO(f.read()))
j=json.loads(g.read())

print(j['questions'][0]['tags'])
# [u'python', u'regex']
3 голосов
/ 14 сентября 2010

Поскольку имена тегов Stackoverflow не имеют встроенного < >, вы можете использовать регулярное выражение:

<(.*?)>

или

<([^>]*)>

Пояснение:

  • <: буквальный <
  • (..): группировать и запоминать матч.
  • .*?: чтобы соответствовать чему-либо в не жадный способ.
  • >: буквальное <
  • [^>]: класс char, соответствующий ничего, кроме >
2 голосов
/ 14 сентября 2010

Вот быстрое и грязное решение:

#!/usr/bin/python

import re
pattern = re.compile("<(.*?)>")
data = """
<javascript><internet-explorer>

<c#><windows><best-practices><winforms><windows-services>

<c><algorithm><sorting><word>

<java>
"""

for each in pattern.findall(data):
    print each

Обновление

Уставное предупреждение : если дамп данных находится в формате XML илиJSON (как прокомментировал один из пользователей), тогда вам гораздо лучше использовать подходящий синтаксический анализатор XML или JSON.

...