当存在格式标记时,将句子拆分为单词



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

"('?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', '!']

您将如何解决这个问题?

您可以使用单词边界正则表达式,使用负后看断言和前瞻断言指定匹配项的排除:

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

正则表达式演示。

不幸的是,python 正则表达式引擎不支持拆分零宽度字符,因此您必须使用解决方法。

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

蟒蛇演示。

# 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', '!']

最新更新