Python 如何使用自定义标记格式轻松解析文本

Python 如何使用自定义标记格式轻松解析文本,python,parsing,Python,Parsing,我有带打开/关闭双括号标记[[tag]]/[[/tag]]的文本,我想对所有文本应用一个特定的函数,除了标记内的文本 我已经看过python解析器,但是它们非常复杂,我无法让它们工作 举个例子,我想转换: “文本[[tag]]文本[[/tag]]文本[[tag]]文本[[/tag]]文本[[/tag]]文本” 在 “文本文本[[tag]]TEXT文本[[/tag]]TEXT文本[[tag]]TEXT文本[[/tag]]TEXT文本”您需要保留一个标志来检查标记的开始和结束。类似下面显示的代码 &

我有带打开/关闭双括号标记[[tag]]/[[/tag]]的文本,我想对所有文本应用一个特定的函数,除了标记内的文本

我已经看过python解析器,但是它们非常复杂,我无法让它们工作

举个例子,我想转换:

“文本[[tag]]文本[[/tag]]文本[[tag]]文本[[/tag]]文本[[/tag]]文本”


“文本文本[[tag]]TEXT文本[[/tag]]TEXT文本[[tag]]TEXT文本[[/tag]]TEXT文本”

您需要保留一个标志来检查标记的开始和结束。类似下面显示的代码

>>> s = "text text text [[tag]] text text [[/tag]] text text text [[tag]] text text [[/tag]] text text"
>>> new_string = []
>>> caps=True

>>> for el in s.split():
    if '/' in el:
        caps=True
        new_string.append(el)
        continue
    elif '[[' in el:
        caps=False
    if caps:
        new_string.append(el.upper())
    else:
        new_string.append(el)


>>> " ".join(new_string)
'TEXT TEXT TEXT [[tag]] text text [[/tag]] TEXT TEXT TEXT [[tag]] text text [[/tag]] TEXT TEXT'

像这样带国旗的东西应该会有帮助

def customtag(string):
    lock = 0
    fstring = ''
    for st in string.split(' '):
        if '[' not in st and lock != 1:
            fstring += f'{st.upper()} '
        else:
            lock = 1
            fstring += f'{st} '
            if '/' in st:
                lock = 0
    print(fstring)
    return fstring


customtag("text text text [[tag]] text text [[/tag]] text text text [[tag]] text text [[/tag]] text text")

这里有另一种方法,使用堆栈

from sys import stdin


def transform(text):
    return text.upper()

open_tag = '[[tag]]'
close_tag = '[[/tag]]'
tag_stack = []
output_tokens = []
for line in stdin:
    tokens = line.split(' ')
    print(tokens)
    for token in tokens:
        output_token = token
        if len(tag_stack) == 0:
            output_tokens.append(transform(output_token))
        else:
            output_tokens.append(output_token)
        if token == open_tag:
            tag_stack.append(open_tag)
        elif token == close_tag:
            tag_stack.pop()
print(' '.join(output_tokens))
使用re:

import re

# raw text example
raw_text = "text text text [[tag]] text text [[/tag]] text text text [[tag]] text text [[/tag]] text text"

# get text outside tags
convert_text = re.split('\[\[tag\]\].*?\[\[/tag\]\]',raw_text)
convert_text = [string.upper() for string in convert_text]

# get text inside tags with tags
remaining_parts = re.findall('\[\[tag\]\].*?\[\[/tag\]\]', raw_text)
remaining_parts.extend(' ')

# zip two lists
zipped_data = list(zip(convert_text, remaining_parts))

# convert into list
data = []
for item in zipped_data:
    data.append(item[0])
    data.append(item[1])

# join strings
out_string = ''.join(data)
输出:

TEXT TEXT TEXT [[tag]] text text [[/tag]] TEXT TEXT TEXT [[tag]] text text [[/tag]] TEXT TEXT

有多个标签吗?可以包装吗?转换为标准标记机制,然后使用标准工具可能是阻力最小的途径。