выражение XPath для подобного regex соответствия?

Я бы предложил такую ​​программу,

class meaning():
    def shortcutA(self):
        return "ice cream"

    def shortcutB(self):
        return "Chocolet cake"


def main():
    m = meaning()
    code = ''
    for alphabet in user_input:
        if alphabet == "a":
            code += ' ' + m.shortcutA()
        elif alphabet == "b":
            code += ' ' + m.shortcutB()
    if len(code) == 0:
        print 'Unrecognized.'
    else:
        print 'The code is : ' + code


user_input = raw_input('Please enter the words : \n')

if __name__ == "__main__":
    main()
12
задан Gumbo 28 February 2009 в 16:50
поделиться

3 ответа

Как насчет (обновленного):

XPath 1.0:

"//div[substring-before(@id, '_') = 'foo' 
       and substring-after(@id, '_') >= 0 
       and substring-after(@id, '_') <= 99999999]"

Редактирование № 2: OP внес изменение в вопрос. Следующее, еще более уменьшенное выражение XPath 1.0 работает на меня:

"//div[substring(@id, 1, 13) = 'post_message_' 
       and substring(@id, 14) >= 0 
       and substring(@id, 14) <= 99999999]"

XPath 2.0 имеет удобное matches() функция:

"//div[matches(@id, '^foo_\d{1,8}$')]"

Кроме лучшей мобильности, я ожидал бы, что числовое выражение (стиль XPath 1.0) будет работать лучше, чем тест regex, хотя это только станет примечательным при обработке больших наборов данных.


Исходная версия ответа:

"//div[substring-before(@id, '_') = 'foo' 
       and number(substring-after(@id, '_')) = substring-after(@id, '_') 
       and number(substring-after(@id, '_')) &gt;= 0 
       and number(substring-after(@id, '_')) &lt;= 99999999]"

Использование number() функция является ненужной, потому что математические операторы сравнения принуждают свои аргументы числам неявно, любые нечисла станут NaN и большее, чем/меньшее количество, чем тесты перестанет работать.

Я также удалил кодирование угловых скобок, так как это - требование XML, не требование XPath.

15
ответ дан 2 December 2019 в 07:04
поделиться

Как уже говорилось в XPath 2.0 было бы хорошо использовать свой стандарт regex возможности с функцией как matches() функция.

Одно возможное решение XPath 1.0:

//div[starts-with(@id, 'post_message_')
    and
      string-length(@id) = 21
    and
      translate(substring-after(@id, 'post_message_'), 
                '0123456789', 
                ''
                )
     =
      ''
      ] 

Действительно отметьте следующее:

  1. Использование стандартной функции XPath starts-with().

  2. Использование стандартной функции XPath string-length().

  3. Использование стандартной функции XPath substring-after().

  4. Использование стандартной функции XPath translate().

5
ответ дан 2 December 2019 в 07:04
поделиться

Или используйте соответствия функции xpath (строка, шаблон).

  <xsl:if test="matches(name(.),'foo_')">

К сожалению, это не regex, но это могло бы быть достаточно, если у Вас нет других тегов foo_, Вам не нужно, затем я Предположение, можно добавить еще много "если" проверки для отбора их.

2
ответ дан 2 December 2019 в 07:04
поделиться
Другие вопросы по тегам:

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