首页 > 解决方案 > 在保持内联标签完整的同时按字符分隔 python 字符串

问题描述

我正在尝试在 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)

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

标签: pythonregexnlpdata-cleaning

解决方案


您可以使用以下正则表达式re.findall

\*[^*]*\*|.

请参阅正则表达式演示re.Sorre.DOTALL标志可以与此模式一起使用,以便还.可以匹配默认情况下不匹配的换行符。

细节

  • \*[^*]*\*- 一个*字符,后跟零个或多个字符*,然后是一个*
  • | - 或者
  • .- 任何一个字符(带re.S)。

请参阅Python 演示

import re
s = 'This is *tag1* a test *tag2*.'
print( re.findall(r'\*[^*]*\*|.', s, re.S) )
# => ['T', 'h', 'i', 's', ' ', 'i', 's', ' ', '*tag1*', ' ', 'a', ' ', 't', 'e', 's', 't', ' ', '*tag2*', '.']

推荐阅读