добавить собственный текст внутри вложенных фигурных скобок

У меня есть этот источник текста, который содержит <html> <head> <title> <? php echo "title here" ; ?> </ title> <head> <body> <h1 <? php echo "class = 'big'" ?>> foo </ h1> </ body> </ html> и PHP-код одновременно:

<html>
<head>
<title><?php echo "title here"; ?></title>
<head>
	<body>
		<h1 <?php echo "class='big'" ?>>MY_TEXTfoo</h1>
	</body>
</html>

и мне нужно разместить собственный текст (например: MY_TEXT) после открытия тега и получить этот результат:

nestedExpr

поэтому мне нужно рассмотреть вложенные фигурные скобки

если я буду использовать регулярное выражение, это создаст проблемы (мне нужно рассмотреть любой уровень вложенных фигурных скобок). Мне нужна другая стратегия.

теперь моя идея пытается использовать pyparsing, но я не могу получить его сейчас, слишком сложный для моего текущего уровня

Может ли кто-нибудь решить проблему?

python,pyparsing,python-textprocessing,

1

Ответов: 1


1 принят

Pyparsing имеет вспомогательный метод, <h1>который позволяет легко сопоставлять строки вложенных открытых / закрытых разделителей. Поскольку у вас есть вложенные теги PHP в вашем nestedExprтеге, я бы использовал :nested_angle_braces = nestedExpr('<', '>')

for match in nested_angle_braces.searchString(html):
    print match

Однако это будет соответствовать каждому тегу в исходном HTML-источнике:

[['html']]
[['head']]
[['title']]
[['?php', 'echo', '"title here"', ';', '?']]
[['/title']]
[['head']]
[['body']]
[['h1', ['?php', 'echo', '"class='big'"', '?']]]
[['/h1']]
[['/body']]
[['/html']]

дает:

addCondition

Вы хотите совместить только те теги, чей открытый текст «h1». Мы можем добавить условие к выражению в pyparsing, используя :nested_angle_braces_with_h1 = nested_angle_braces().addCondition( lambda tokens: tokens[0][0].lower() == 'h1')

nestedExpr

Теперь мы сопоставим только желаемый тег. Еще несколько шагов ...

Прежде всего, originalTextForвозвращает вложенные списки совпадающих элементов. Мы хотим, чтобы исходный текст был сопоставлен. Pyparsing включает в себя еще один помощник для этого, невообразимо названный - мы комбинируем это с предыдущим определением:nested_angle_braces_with_h1 = originalTextFor( nested_angle_braces().addCondition(lambda tokens: tokens[0][0].lower() == 'h1') )

nested_angle_braces_with_h1.addParseAction(lambda tokens: tokens[0] + 'MY_TEXT')

Наконец, мы должны добавить еще одно действие обратного вызова разбора, чтобы добавить «MY_TEXT» к тегу:

<h1>

Теперь, когда мы можем сопоставить желаемый transformStringтег, мы можем использовать метод выражения для выполнения поиска и замены для нас:print(nested_angle_braces_with_h1.transformString(html))

html

Когда ваш оригинальный образец сохранен как переменная с именем html, мы получаем:

<html>
<head>
<title><?php echo "title here"; ?></title>
<head>
        <body>
                <h1 <?php echo "class='big'" ?>>MY_TEXTfoo</h1>
        </body>
</html>

Примечание: после каждого <h1> тега это добавит «MY_TEXT» . Если вы хотите, чтобы это было применено только после <h1>тегов, содержащих PHP, напишите соответствующее условие и добавьте его nested_angle_braces_with_h1.

питон, Pyparsing, питон-textprocessing,
Похожие вопросы