我无法将连续字符串拆分为更合理的部分:
E.g。 'MarieMüller'应成为'MarieMüller'
到目前为止,我已经使用了这个,如果没有特殊字符,它就会起作用:
kNNClassifier classifier = new kNNClassifier(new Word2Vec((PollsInterface.class.getClassLoader().getResource("vectors.bin")).getPath().substring(1)), 8);
此输出例如'TinaTurner' - > '蒂娜特纳',但不起作用 为'MarieMüller',输出:'MarieMüller' - > 'Marie M \ utf8 ller'
现在我使用正则表达式\ p {L}来了accros:
' '.join([a for a in re.split(ur'([A-Z][a-z]+)', ''.join(entity)) if a])
但这会产生奇怪的事情: 'JenniferLawrence' - > 'Jennifer L awrence'
有人能帮我一把吗?
答案 0 :(得分:3)
如果使用Unicode并需要使用Unicode类别,则应考虑使用PyPi regex module。在那里,您支持所有Unicode类别:
>>> import regex
>>> p = regex.compile(ur'(?<=\p{Ll})(?=\p{Lu})')
>>> test_str = u"Tina Turner\nMarieM\u00FCller\nJacek\u0104cki"
>>> result = p.sub(u" ", test_str)
>>> result
u'Tina Turner\nMarie M\xfcller\nJacek \u0104cki'
^ ^ ^
此处,(?<=\p{Ll})(?=\p{Lu})
正则表达式会找到lower(\p{Ll}
)和大写(\p{Lu}
)字母之间的所有位置,然后regex.sub
会在那里插入一个空格。请注意,如果模式是Unicode字符串(regex.UNICODE
- 前缀),则regex模块会自动使用u
标志编译正则表达式。
答案 1 :(得分:2)
它不适用于扩展角色
您可以使用re.sub()
。它会更简单
(?=(?!^)[A-Z])
用于处理空间
print re.sub(r'(?<=[^\s])(?=(?!^)[A-Z])', ' ', ' Tina Turner'.strip())
处理连续大写字母的情况
print re.sub(r'(?<=[a-z])(?=[A-Z])', ' ', ' TinaTXYurner'.strip())
<强> Ideone Demo 强>
正则表达式细分
(?= #Lookahead to find all the position of capital letters
(?!^) #Ignore the first capital letter for substitution
[A-Z]
)
答案 2 :(得分:0)
使用由Python的字符串操作而不是正则表达式构成的函数,这应该有效:
def split_combined_words(combined):
separated = [combined[1]]
for letter in combined[1:]:
print letter
if (letter.islower() or (letter.isupper() and separated[-1].isupper())):
separated.append(letter)
else:
separated.extend((" ", letter))
return "".join(separated)