我使用的POS标记器处理以下字符串
3+2
如下图所示。
3/num++/sign+2/num
我想使用python将此结果拆分如下。
['3/num', '+/sign', '2/num']
我该怎么做?
答案 0 :(得分:6)
使用re.split
-
>>> import re
>>> re.split(r'(?<!\+)\+', '3/num++/sign+2/num')
['3/num', '+/sign', '2/num']
正则表达式模式将在+
符号上分割,只要其前没有其他+
。
(?<! # negative lookbehind
\+ # plus sign
)
\+ # plus sign
请注意,lookbehinds(通常)不支持不同的长度模式。
答案 1 :(得分:1)
我认为棘手的部分是双+
符号。您可以用特殊字符替换标志并完成它。
这应该有效,
st = '3/num++/sign+2/num'
st = st.replace('++', '@$')
st = st.replace('+', '@')
st = st.replace('$', '+')
print (st.split('@'))
这样做的一个问题是,您的原始字符串不能包含这些特殊字符@
&amp; $
。所以你需要为你的用例仔细选择它们。
修改:这个答案很天真。正则表达式更好 也就是说,正如COLDSPEED所指出的那样,你应该使用以下正则表达方法,使用lookbehind,
import re
print re.split(r'(?<!\+)\+', '3/num++/sign+2/num')
答案 2 :(得分:0)
虽然要求使用正则表达式,但这里有一个关于如何使用标准.split()
执行此操作的示例:
my_string = '3/num++/sign+2/num'
my_list = []
result = []
# enumerate over the split string
for e in my_string.split('/'):
if '+' in e:
if '++' in e:
#split element on double + and add in + as well
my_list.append(e.split('++')[0])
my_list.append('+')
else:
#split element on single +
my_list.extend(e.split('+'))
else:
#add element
my_list.append(e)
# at this point my_list contains
# ['3', 'num', '+', 'sign', '2', 'num']
# enumerate on the list, steps of 2
for i in range(0, len(my_list), 2):
#add result
result.append(my_list[i] + '/' + my_list[i+1])
print('result', result)
# result returns
# ['3/num', '+/sign', '2/num']