Regex: вытащить подстроку между двумя тегами в строке

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))
45
задан Aditi Parikh 14 September 2017 в 07:01
поделиться

6 ответов

\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

Это должно, надо надеяться, отбросить [start] и [end] маркеры также.

23
ответ дан YCF_L 26 November 2019 в 21:05
поделиться
\[start\](.*?)\[end\]

Zhich'll помещают текст в середине в получении.

63
ответ дан YCF_L 26 November 2019 в 21:05
поделиться

Более полное обсуждение ловушек использования 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
4
ответ дан Jon Ericson 26 November 2019 в 21:05
поделиться

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

Много реализаций регулярного выражения, таких как PCRE или регулярные выражения perl, отслеживание в обратном порядке поддержки, которое может использоваться для достижения этого грубого эффекта. Но PCRE (в отличие от жемчуга) не поддерживает неограниченное отслеживание в обратном порядке, и это может на самом деле вызвать вещи прервать странные пути, как только у Вас есть слишком много тегов.

существует очень обычно цитируемое сообщение в блоге, которое обсуждает это больше, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Google для него, и проверяйте кэш в настоящее время, у них, кажется, есть некоторое время простоя)

4
ответ дан Daniel Papasian 26 November 2019 в 21:05
поделиться

С 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
}
1
ответ дан brian d foy 26 November 2019 в 21:05
поделиться

Что ж, если вы гарантируете, что за каждым начальным тегом следует конечный тег, то следующее будет работать.

\[start\](.*?)\[end\]

Однако, если у вас есть сложный текст, такой как следующий:

[start] sometext [start] sometext2 [end] sometext [end]

тогда вы столкнетесь с проблемами с регулярным выражением.

Теперь в следующем примере будут извлечены все горячие ссылки на странице:

'/<a(.*?)a>/i'

В приведенном выше случае мы можем гарантировать, что не будет никаких вложенных случаев:

'<a></a>'

Итак , это сложный вопрос, и на него нельзя просто ответить простым ответом.

3
ответ дан 26 November 2019 в 21:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: