如何轻松解析具有自定义标签格式的文本

时间:2019-06-02 09:56:30

标签: python parsing

我的文本带有带开/关双括号标签[[tag]] / [[// tag]],并且我想对标签中除文本之外的所有文本应用特定功能。

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

举个例子,我要转换:

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

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

4 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分:0)

您需要保留一个标志以检查标签的开始和结束。类似于下面的代码,

>>> 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'

答案 2 :(得分:0)

带有标记的东西应该会有所帮助。

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")

答案 3 :(得分:0)

这是使用堆栈的另一种方法。

"email": "email\\@gmail.com"