Я бы предложил такую программу,
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()
Как насчет (обновленного):
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, '_')) >= 0
and number(substring-after(@id, '_')) <= 99999999]"
Использование number()
функция является ненужной, потому что математические операторы сравнения принуждают свои аргументы числам неявно, любые нечисла станут NaN
и большее, чем/меньшее количество, чем тесты перестанет работать.
Я также удалил кодирование угловых скобок, так как это - требование XML, не требование XPath.
Как уже говорилось в 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',
''
)
=
''
]
Действительно отметьте следующее:
Использование стандартной функции XPath starts-with()
.
Использование стандартной функции XPath string-length()
.
Использование стандартной функции XPath substring-after()
.
Использование стандартной функции XPath translate()
.
Или используйте соответствия функции xpath (строка, шаблон).
<xsl:if test="matches(name(.),'foo_')">
К сожалению, это не regex, но это могло бы быть достаточно, если у Вас нет других тегов foo_, Вам не нужно, затем я Предположение, можно добавить еще много "если" проверки для отбора их.