使用python正则表达式进行单词标记化

use*_*420 15 python regex tags string

我试图在python中将字符串拆分为"标签"列表.拆分应该处理诸如"HappyBirthday"之类的字符串并删除大多数标点符号但保留连字符和撇号.我的出发点是:

tags = re.findall("([A-Z]{2,}(?=[A-Z]|$)|[A-Z][a-z]*)|\w+-\w+|[\w']+"
Run Code Online (Sandbox Code Playgroud)

我想转换这个示例数据:

Jeff's dog is un-American SomeTimes! BUT NOTAlways
Run Code Online (Sandbox Code Playgroud)

成:

['Jeff's', 'dog', 'is', 'un-American', 'Some', 'Times', 'BUT', 'NOT', 'Always']
Run Code Online (Sandbox Code Playgroud)

PS我很抱歉我的描述不是很好.我不确定如何解释它,并且大多数谷歌都没有成功.我希望这个例子能够恰当地说明它.

编辑:我想我需要更精确,所以,

  1. 如果这个词被夸大和资本,就像"联合国美国人"一样,它会把它保持为一个单词,那么输出将是"联合国 - 美国"
  2. 如果连字符在一侧或两侧都有一个空格,则a''这是'或'这是 - 是'它应该忽略了那个并产生["这个","是"]和["这个","是" ]尊敬地,
  3. 如果它在一个像"What'sItCalled"这样的单词的中间,那么它应该产生["What's","It","Called"]

phy*_*nfo 23

我建议如下:

re.findall("[A-Z]{2,}(?![a-z])|[A-Z][a-z]+(?=[A-Z])|[\'\w\-]+",s)
Run Code Online (Sandbox Code Playgroud)

这样可以得到你的例子:

["Jeff's", 'dog', 'is', 'un-American', 'Some', 'Times', 'BUT', 'NOT', 'Always']
Run Code Online (Sandbox Code Playgroud)

说明:RegExp由3个备选方案组成:

  1. [A-Z]{2,}(?![a-z]) 匹配所有字母大写的单词
  2. [A-Z][a-z]+(?=[A-Z])匹配带有第一个captitel字母的单词.前瞻(?=[A-Z])在下一个大写字母之前停止匹配
  3. [\'\w\-]+匹配所有其余的,即可能包含'和的单词-.