【问题标题】:Split string at capital letter but only if no whitespace以大写字母拆分字符串,但前提是没有空格
【发布时间】:2018-05-10 13:50:06
【问题描述】:

设置

我有一串名字需要分成一个列表。

关注this answer,我有,

string = 'KreuzbergLichtenbergNeuköllnPrenzlauer Berg'
re.findall('[A-Z][a-z]*', string)

最后一行给我的地方,

['Kreuzberg', 'Lichtenberg', 'Neuk', 'Prenzlauer', 'Berg']

问题

1) 空格被忽略

“Prenzlauer Berg”实际上是 1 个名称,但代码根据“split-at-capital-letter”规则进行拆分。

如果前面的字符是空格,确保它在大写字母处拆分的命令是什么?

2) 特殊字符处理不好

使用的代码无法处理'ö'。如何包含此类“德语”字符?

即我想获得,

['Kreuzberg', 'Lichtenberg', 'Neukölln', 'Prenzlauer Berg']

【问题讨论】:

    标签: python string split whitespace


    【解决方案1】:

    您可以使用正面和负面的lookbehind并明确列出元音变音:

    >>> string = 'KreuzbergLichtenbergNeuköllnPrenzlauer Berg'
    >>> re.findall('(?<!\s)[A-ZÄÖÜ](?:[a-zäöüß\s]|(?<=\s)[A-ZÄÖÜ])*', string)
    ['Kreuzberg', 'Lichtenberg', 'Neukölln', 'Prenzlauer Berg']
    

    (?&lt;!\s)...:匹配前面没有\s...

    (?&lt;=\s)...:匹配前面有\s...

    (?:...): 非捕获组,以免混淆 findall 结果

    【讨论】:

      【解决方案2】:

      这行得通

      string="KreuzbergLichtenbergNeuköllnPrenzlauer Berg"
      pattern="[A-Z][a-ü]+\s[A-Z][a-ü]+|[A-Z][a-ü]+"
      re.findall(pattern, string)
      #>>>['Kreuzberg', 'Lichtenberg', 'Neukölln', 'Prenzlauer Berg']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-20
        • 2018-12-13
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 2019-08-08
        • 1970-01-01
        相关资源
        最近更新 更多