我使用以下正则表达式将句子分成单词:
"('?\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', '!']
你会如何解决这个问题?
答案 0 :(得分:1)
你可以使用单词边界正则表达式,使用负向lookbehind和lookahead断言指定匹配排除:
^|(?<!['<\/-])\b(?![>-])
不幸的是,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', '!']
答案 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', '!']