Чтобы обработать ваши отредактированные случаи, я бы изменил phynfo (+1) отличный ответ на
>>> s = """Jeff's UN-American Un-American un-American
SomeTimes! BUT NOTAlways This- THIS-
What'sItCalled someTimes"""
>>> re.findall("[A-Z\-\']{2,}(?![a-z])|[A-Z\-\'][a-z\-\']+(?=[A-Z])|[\'\w\-]+",s)
["Jeff's", 'UN-', 'American', 'Un-', 'American', 'un-American',
'Some', 'Times', 'BUT', 'NOT', 'Always', 'This-', 'THIS-',
"What's", 'It', 'Called' 'someTimes']
Вы должны четко определить правила для желаемого поведения. Токенизация не является определением, вы должны иметь что-то похожее на правила phynfo. Например, у вас есть правило, что 'NOTAlways'
должно переходить к 'NOT'
и 'Always'
, и что дефисы должны быть сохранены. Таким образом, 'UN-American'
разделен, как UNAmerican будет разделен. Вы можете попытаться определить дополнительные правила, но у вас должно быть четкое представление о том, какое правило применяется, когда правила перекрываются.