用于分隔折叠标题的正则表达式

Regex expression to separate collapsed title

第一次post。我有一段文本,其中很多标题大写的文本在没有空格的情况下被折叠。我试着: a) 保留全文(不要松散任何单词), b) 使用逻辑来分隔 'A',如 'A Way Forward', c) 避免分隔首字母缩略词,例如 EPA、DOJ 等(它们已经全部大写)。

我的正则表达式代码非常接近,但它在单词的开头或结尾留下 'A':

f = "TheCuriousIncidentOfAManInAWhiteHouseAt1600PennsylvaniaAveAndTheEPA"

re.sub( r"([A-Z][a-z]|[A-Z][A-Z]|\d+)", r " \1", f).split()

输出:

['The', 'Curious', 'Incident', 'Of', 'AMan','In', 'AWhite','House', 'At', '1600', 'Pennsylvania', 'Ave', 'And', 'The', 'EPA']

问题输出如'AMan'、'AWhite'等

应该是:

['The', 'Curious', 'Incident', 'Of', 'A', 伙计','In','A',白','House','At','1600','Pennsylvania' , 'Ave', 'And', 'The', 'EPA']

谢谢

欢迎来到 Stack Overflow Greg。正则表达式的良好开端。

我会尝试这样的事情:

([A-Z]{2,}(?![a-z])|[a-zA-Z][a-z]*|[0-9]+)

分解,解释:

([A-Z]{2,}(?![a-z])  // 2 or more capital letters, not followed by a lowercase letter
|                    // OR
[a-zA-Z][a-z]*       // Any letter, followed by any number of lowercase letters
|                    // OR
[0-9]+)              // One or more digits

最好这样使用:

re.findall(r'([A-Z]{2,}(?![a-z])|[a-zA-Z][a-z]*|[0-9]+)', s)

Try it online(包含 \W* 用于格式化)