我正在尝试将字符串拆分为python中的“标签”列表。拆分应该处理诸如“HappyBirthday”之类的字符串并删除大多数标点符号但保留连字符和撇号。我的出发点是:
tags = re.findall("([A-Z]{2,}(?=[A-Z]|$)|[A-Z][a-z]*)|\w+-\w+|[\w']+"
我想转换此示例数据:
Jeff's dog is un-American SomeTimes! BUT NOTAlways
分为:
['Jeff's', 'dog', 'is', 'un-American', 'Some', 'Times', 'BUT', 'NOT', 'Always']
P.S。对不起,我的描述不是很好。我不确定如何解释它,并且大多数谷歌都没有成功。我希望这个例子能够恰当地说明它。
编辑:我认为我需要更精确,所以,
答案 0 :(得分:22)
我建议如下:
re.findall("[A-Z]{2,}(?![a-z])|[A-Z][a-z]+(?=[A-Z])|[\'\w\-]+",s)
这样可以得到你的例子:
["Jeff's", 'dog', 'is', 'un-American', 'Some', 'Times', 'BUT', 'NOT', 'Always']
说明:RegExp由3个备选方案组成:
[A-Z]{2,}(?![a-z])
匹配所有字母大写的字词[A-Z][a-z]+(?=[A-Z])
匹配带有第一个captitel字母的字词。前瞻(?=[A-Z])
在下一个大写字母[\'\w\-]+
匹配所有其他内容,即可能包含'
和-
的字词。答案 1 :(得分:1)
为了处理您编辑的案例,我会修改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'
被分开,就像美国联邦分裂一样。您可以尝试定义其他规则,但必须明确规则重叠时应用的规则。