在python中使用regex re.split拆分堆叠的实体

时间:2016-04-25 11:10:24

标签: python regex nlp

我无法将连续字符串拆分为更合理的部分:

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'

有人能帮我一把吗?

3 个答案:

答案 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)