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

时间:2019-01-31 23:11:56

标签: regex regex-negation regex-lookarounds regex-group

第一次发帖。我有一个文本,其中标题中的许多文本都折叠而没有空格。我试着: a)保留全文(不要遗漏任何单词), b)如“前进之路”中那样使用逻辑来分隔“ A”, c)避免分离首字母缩略词,例如EPA,DOJ等(已经大写)。

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

f =“在宾夕法尼亚州白宫,一个人的好奇事件发生在1600年,宾夕法尼亚州Ave和TheEPA”

re.sub(r“([[AZ] [az] | [AZ] [AZ] | \ 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',Man','In','A',White' ,“房屋”,“在”,“ 1600”,“宾夕法尼亚州”,“ Ave”,“ And”,“ The”,“ EPA”]

谢谢

1 个答案:

答案 0 :(得分:0)

欢迎使用堆栈溢出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*用于格式化)