按字符分隔python字符串,同时保持内联标记不变

按字符分隔python字符串,同时保持内联标记不变,python,regex,nlp,data-cleaning,Python,Regex,Nlp,Data Cleaning,我正在尝试用python制作一个与内联标记一起工作的自定义标记器。目标是获取如下所示的字符串输入: 'This is *tag1* a test *tag2*.' 并让它输出一个由标记和字符分隔的列表: ['T', 'h', 'i', 's', ' ', 'i', 's', ' ', '*tag1*', ' ', 'a', ' ', 't', 'e', 's', 't', ' ', '*tag2*', '.'] 如果没有标签,我只会使用list(),我想我找到了一个解决方案,可以处理单个标

我正在尝试用python制作一个与内联标记一起工作的自定义标记器。目标是获取如下所示的字符串输入:

'This is *tag1* a test *tag2*.'
并让它输出一个由标记和字符分隔的列表:

['T', 'h', 'i', 's', ' ', 'i', 's', ' ', '*tag1*', ' ',  'a', ' ', 't', 'e', 's', 't', ' ', '*tag2*', '.']
如果没有标签,我只会使用
list()
,我想我找到了一个解决方案,可以处理单个标签类型,但是有多个标签类型。还有其他多字符段,例如椭圆,应该作为单个特征进行编码。
我尝试过的一件事是用一个未使用的字符替换标记,然后在字符串上使用
list()

text = 'This is *tag1* a test *tag2*.'
tidx = re.match(r'\*.*?\*', text)
text = re.sub(r'\*.*?\*', r'#', text)
text = list(text)

然后我会迭代它,并用提取的标记替换“#”,但我有多个不同的功能,我正在尝试提取,并且在拆分字符串之前用不同的占位符字符多次重复该过程似乎是一种糟糕的做法。有没有更简单的方法来做这样的事情?我对这个还是很陌生,所以仍然有很多我不知道的常用方法。我想我也可以使用一个更大的正则表达式,它包含了我试图提取的所有特性,但它仍然感觉很粗糙,我更喜欢使用一些更模块化的东西,可以用来查找其他特性,而无需每次编写新的表达式。

您可以将下面的正则表达式与
re.findall
一起使用:

\*[^*]*\*\124;。
看。
re.S
re.DOTALL
标志可用于此模式,以便
也可以匹配默认情况下不匹配的换行符

详细信息

  • \*[^*]*\*
    -一个
    *
    字符,后跟除
    *
    以外的零个或多个字符,然后是一个
    *
  • |
    -或
  • -任意一个字符(带有
    re.S
见:

重新导入
s='这是*tag1*a测试*tag2*'
打印(关于findall(r'\*[^*]*\*\*\\*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
#=>['T','h','i','s','i','s','tag1*','a','T','e','s','T','tag2*','

我不确定什么对您最合适,但您应该能够使用下面显示的split()方法或.format()方法来获得您想要的

# you can use this to get what you need
txt = 'This is *tag1* a test *tag2*.'
x = txt.split("*") #Splits up at *
x = txt.split() #Splits all the words up at the spaces
print(x)

# also, you may be looking for something like this to format a string
mystring = 'This is {} a test {}.'.format('*tag1*', '*tag2*')
print(mystring)


# using split to get ['T', 'h', 'i', 's', ' ', 'i', 's', ' ', '*tag1*', ' ',  'a', ' ', 't', 'e', 's', 't', ' ', '*tag2*', '.']
txt = 'This is *tag1* a test *tag2*.'
split = txt.split("*") #Splits up at *

finallist = [] # initialize the list
for string in split:

    # print(string)
    if string == '*tag1*':
        finallist.append(string)
        # pass
    elif string == '*tag2*.':
        finallist.append(string)

    else:
        for x in range(len(string)):
            letter = string[x]
            finallist.append(letter)

print(finallist)

看看词法扫描器,为你的文本写一个语法,它会为你解析,或者写你自己的状态机。这看起来很好。我没有扩展表达式来处理省略号和其他功能,而是使用了两个以上的正则表达式函数,按照星号方案将所有这些函数转换为标记,所以一切都会正常工作。@utilityscarab很高兴它能为您工作。另外,如果我的回答对您有帮助(请参阅),因为您在达到15个代表点后有权享有向上投票的特权。注意:你可以投票选出所有有帮助的答案。