import simplejson
class User(object):
def __init__(self, name, mail):
self.name = name
self.mail = mail
def _asdict(self):
return self.__dict__
print(simplejson.dumps(User('alice', 'alice@mail.com')))
, если используется стандарт json
, необходимо определить функцию default
import json
def default(o):
return o._asdict()
print(json.dumps(User('alice', 'alice@mail.com'), default=default))
\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]
Это должно, надо надеяться, отбросить [start]
и [end]
маркеры также.
\[start\](.*?)\[end\]
Zhich'll помещают текст в середине в получении.
Более полное обсуждение ловушек использования regex для нахождения соответствия тегам может быть найдено в: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . В частности, знайте, что вложенным тегам действительно нужен законченный синтаксический анализатор, чтобы интерпретироваться правильно.
Примечание, что чувствительность к регистру должна будет быть выключена для ответа на вопрос, как указано. В жемчуге это я модификатор:
$ echo "Data Data Data [Start] Data i want [End] Data" \
| perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
Data i want
другой прием должен использовать *? квантор, который выключает жадность полученного соответствия. Например, если у Вас есть несоответствие [конец] тег:
Data Data [Start] Data i want [End] Data [end]
Вы, вероятно, не хотите получать:
Data i want [End] Data
В то время как можно использовать регулярное выражение для парсинга данных между открывающими и закрывающими тэгами, необходимо хорошо подумать относительно того, является ли это путем, по которому Вы хотите спуститься. Причиной его является потенциал тегов к вложенному множеству: если вложенные теги могли бы когда-либо происходить или могут когда-либо происходить, язык, как говорят, больше не является регулярным, и регулярные выражения прекращают быть надлежащим инструментом для парсинга его.
Много реализаций регулярного выражения, таких как PCRE или регулярные выражения perl, отслеживание в обратном порядке поддержки, которое может использоваться для достижения этого грубого эффекта. Но PCRE (в отличие от жемчуга) не поддерживает неограниченное отслеживание в обратном порядке, и это может на самом деле вызвать вещи прервать странные пути, как только у Вас есть слишком много тегов.
существует очень обычно цитируемое сообщение в блоге, которое обсуждает это больше, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Google для него, и проверяйте кэш в настоящее время, у них, кажется, есть некоторое время простоя)
С Perl можно окружить данные, которые Вы хотите с () и вытаскиваете его позже, возможно, другие языки имеют подобную функцию.
if ($s_output =~ /(data data data data START(data data data)END (data data)/)
{
$dataAllOfIt = $1; # 1 full string
$dataInMiddle = $2; # 2 Middle Data
$dataAtEnd = $3; # 3 End Data
}
Что ж, если вы гарантируете, что за каждым начальным тегом следует конечный тег, то следующее будет работать.
\[start\](.*?)\[end\]
Однако, если у вас есть сложный текст, такой как следующий:
[start] sometext [start] sometext2 [end] sometext [end]
тогда вы столкнетесь с проблемами с регулярным выражением.
Теперь в следующем примере будут извлечены все горячие ссылки на странице:
'/<a(.*?)a>/i'
В приведенном выше случае мы можем гарантировать, что не будет никаких вложенных случаев:
'<a></a>'
Итак , это сложный вопрос, и на него нельзя просто ответить простым ответом.