Не может получить работу регулярного выражения правильно с мультилинией

Для __init__.py

  1. есть две основные причины. Для удобства: другим пользователям не нужно знать точное местоположение ваших функций в иерархии пакетов.
    your_package/
      __init__.py
      file1.py/
      file2.py/
        ...
      fileN.py
    
    # in __init__.py
    from file1 import *
    from file2 import *
    ...
    from fileN import *
    
    # in file1.py
    def add():
        pass
    
    , тогда другие могут вызывать add () с помощью
    from your_package import add
    
    без знания файла1, например
    from your_package.file1 import add
    
  2. . Если вы хотите, чтобы что-то было инициализировано; например, каротаж (который должен быть помещен на верхний уровень):
    import logging.config
    logging.config.dictConfig(Your_logging_config)
    
15
задан Hamish Downer 25 November 2008 в 20:08
поделиться

4 ответа

я полагаю, что опция использовать RegexOptions.Singleline вместо RegexOptions.Multiline ( src). разрешение (.) соответствовать новым строкам должно работать в Вашем случае.

... режим, где точка также соответствует новым строкам, называют "однострочным режимом". Это немного неудачно, потому что легко путать этот термин с "многострочным режимом". Многострочный режим только влияет на привязки, и однострочный режим только влияет на точку... При использовании regex классов платформы.NET Вы активируете этот режим путем определения RegexOptions. Одна строка, такой как в Regex. Соответствие ("строка", "regex", RegexOptions. Одна строка).

45
ответ дан 1 December 2019 в 00:07
поделиться

regex символ "." никогда не соответствует новой строке, даже с MultiLine, опция установлена. вместо этого, необходимо использовать [\s\S] или другая комбинация с соответствиями что-либо.

MultiLine опция только изменяет поведение ^ (начните из строки вместо этого fo, начинаются из строки), и $ (конец строки вместо конца строки)

BTW: Действительно, regex не является правильным способом просканировать HTML...

4
ответ дан 1 December 2019 в 00:07
поделиться

Если у Вас все еще есть проблемы с этим, это может быть, потому что Вы используете И со своим RegexOptions вместо ИЛИ.

Этот код является неверным и передаст нуль как второй параметр конструктору:

Regex regExp = new Regex(@"<sys:customtag(.*?)Processtart(.*?)/>(.*?)<sys:customtag (.*?)Procesend(.*?)/>",
RegexOptions.Multiline & RegexOptions.IgnorePatternWhitespace & RegexOptions.CultureInvariant);

Этот код является правильным (насколько использование нескольких флагов RegexOptions):

Regex regExp = new Regex(@"<sys:customtag(.*?)Processtart(.*?)/>(.*?)<sys:customtag (.*?)Procesend(.*?)/>",
RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.CultureInvariant);
4
ответ дан 1 December 2019 в 00:07
поделиться

RegExp является плохим инструментом для xml... мог Вы не, выступы загружают его в XDocument / XmlDocument и используют xpath? При разъяснении модификаций, Вы хотите сделать, я ожидаю, что мы можем восполнить пробелы..., пространства имен являются, вероятно, главным сделать это комплексом в этом случае, таким образом, мы просто должны использовать XmlNamespaceManager.

Вот пример, то есть, предоставленный, более сложный, чем просто regex - однако, я ожидал бы, что это справится намного лучше с нюансами xml:

    string xml = @"<foo xmlns:sys=""foobar""><bar/><bar><sys:customtag sys:sid=""1"" sys:type=""Processtart"" />
<sys:tag>value</sys:tag>
here are some other tags
<sys:tag>value</sys:tag>
<sys:customtag sys:sid=""1"" sys:type=""Procesend"" /></bar><bar/></foo>";

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    XmlNamespaceManager mgr = new XmlNamespaceManager(new NameTable());
    mgr.AddNamespace("sys", "foobar");
    var matches = doc.SelectNodes("//sys:customtag[@sys:type='Processtart']", mgr);
    foreach (XmlElement start in matches)
    {
        XmlElement end = (XmlElement) start.SelectSingleNode("following-sibling::sys:customtag[@sys:type='Procesend'][1]",mgr);
        XmlNode node = start.NextSibling;
        while (node != null && node != end)
        {
            Console.WriteLine(node.OuterXml);

            node = node.NextSibling;
        }
    }
4
ответ дан 1 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

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