格式化标签存在时将句子拆分为单词

时间:2016-04-27 20:04:15

标签: regex

我使用以下正则表达式将句子分成单词:

"('?\w[\w']*(?:-\w+)*'?)"

例如:

import re
re.split("('?\w[\w']*(?:-\w+)*'?)","'cos I like ice-cream")

给出:

['', "'cos", ' ', 'I', ' ', 'like', ' ', 'ice-cream', '!']

但是,格式化标签有时会出现在我的文字中,我的正则表达式显然无法按照我的意愿处理它们:

re.split("('?\w[\w']*(?:-\w+)*'?)","'cos I <i>like</i> ice-cream!")

给出:

['', "'cos", ' ', 'I', ' <', 'i', '>', 'like', '</', 'i', '> ', 'ice-cream', '!']

虽然我想:

['', "'cos", ' ', 'I', ' <i>', 'like', '</i> ', 'ice-cream', '!']

你会如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

你可以使用单词边界正则表达式,使用负向lookbehind和lookahead断言指定匹配排除:

^|(?<!['<\/-])\b(?![>-])

Regex demo.

不幸的是,python正则表达式引擎不支持splitting on zero-width characters,所以你必须使用一种解决方法。

import re

a = re.sub(r"^|(?<!['<\/-])\b(?![>-])", "|", "'cos I <i>like</i> ice-cream!").split('|');
print(a)

#  ['', "'cos", ' ', 'I', ' <i>', 'like', '</i> ', 'ice-cream', '!']

Python demo.

答案 1 :(得分:0)

# I added a negative lookahead to your pattern to assert bracket > is closed properly

import re
print re.split("('?\w[\w']*(?:-\w+)*'?(?!>))","'cos I <i>like</i> ice-cream!" )

[Output]

['', "'cos", ' ', 'I', ' <i>', 'like', '</i> ', 'ice-cream', '!']