Анализ регулярных выражений Python - PullRequest
2 голосов
/ 02 мая 2009

У меня есть массив строк в Python, каждая строка в массиве выглядит примерно так:

<r n="Foo Bar" t="5" s="10" l="25"/> 

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

Но, на самом деле, я не знал много регулярных выражений, но у меня еще ничего не получалось. Это то, что я имею до сих пор.

string = '<r n="Foo Bar" t="5" s="10" l="25"/>'
print re.split("<r\s+n=(?:\"(^\"]+)\").*?/>", string)

Как лучше всего извлечь значения n, t, s и l из этой строки?

Ответы [ 2 ]

7 голосов
/ 02 мая 2009

Это даст вам большую часть пути туда:

>>> print re.findall(r'(\w+)="(.*?)"', string)
[('n', 'Foo Bar'), ('t', '5'), ('s', '10'), ('l', '25')]

re.split и re.findall дополняют друг друга.

Каждый раз, когда ваш мыслительный процесс начинается с «Я хочу, чтобы каждый элемент, похожий на X», вы должны использовать re.findall. Когда это начинается с "Я хочу данные между и вокруг каждого X", используйте re.split.

6 голосов
/ 02 мая 2009
<r n="Foo Bar" t="5" s="10" l="25"/>

Этот источник выглядит как XML, поэтому «лучшим способом» было бы использовать модуль синтаксического анализа XML. Если это не совсем XML, то BeautifulSoup (точнее, модуль BeautifulSoup.BeautifulStoneSoup) может работать лучше, так как это хорошо при работе с возможно недопустимым XML (или вещами, которые "не вполне XML"):

>>> from BeautifulSoup import BeautifulStoneSoup
>>> soup = BeautifulStoneSoup("""<r n="Foo Bar" t="5" s="10" l="25"/>""")

# grab the "r" element (You could also use soup.findAll("r") if there are multiple
>>> soup.find("r")
<r n="Foo Bar" t="5" s="10" l="25"></r>

# get a specific attribute
>>> soup.find("r")['n']
u'Foo Bar'
>>> soup.find("r")['t']
u'5'

# Get all attributes, or turn them into a regular dictionary
>>> soup.find("r").attrs
[(u'n', u'Foo Bar'), (u't', u'5'), (u's', u'10'), (u'l', u'25')]
>>> dict(soup.find("r").attrs)
{u's': u'10', u'l': u'25', u't': u'5', u'n': u'Foo Bar'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...