【问题标题】:Remove lowercase words from python unicode string从python unicode字符串中删除小写单词
【发布时间】:2014-05-24 18:12:05
【问题描述】:

我有一个类似的德国 unicode 字符串

text = u'Und Wenn die Psychoanalytiker, von den d\xfcmmsten bis zu den kl\xfcgsten, im allgemeinen feindselig auf dieses Buch reagiert haben, aber eher defensiv als aggressiv, so liegt das nat\xfcrlich nicht allein am Inhalt, sondern an dieser Str\xf6mung, die noch gr\xf6\xdfer werden wird, denn die Leute haben immer mehr die Nase voll davon, sich sagen zu lassen "Papa, Mama, \xd6dipus, Kastration, Regression" und haben es satt f\xfcr die Sexualit\xe4t im allgemeinen - und ihre im besonderen - ein wirklich bl\xf6dsinniges Bild angeboten zu bekommen. Die Psychoanalytiker sollten, wie man sagt, die "Massen" ber\xfccksichtigen, die kleinen Massen.'

其中还包含Ü Ö Ä 和其他德国特殊字符。我的目标是得到一个只包含以大写字母开头的单词的字符串,如下所示:

result = 'Und Wenn Psychoanalytiker Buch Inhalt Str\xf6mung Leute ...'

我试过了

pattern = r'(\b[^A-Z]+\b)'
re.sub(pattern, '', text)

但我对正则表达式完全陌生

【问题讨论】:

标签: python regex unicode


【解决方案1】:

使用re.sub(...),您将每个匹配项替换为第二个参数指定的字符串。我想你想要的是:

pattern = ur'([A-ZÄÖÜ][^., \t\n]*)'
result = " ".join(re.findall(pattern, text))

更新

这是另一种解决方案。这个比我的第一个精确一点(尤其是德语)。

import re

text = u'Und Wenn die Psychoanalytiker, von den d\xfcmmsten bis zu den kl\xfcgsten, im allgemeinen feindselig auf dieses Buch reagiert haben, aber eher defensiv als aggressiv, so liegt das nat\xfcrlich nicht allein am Inhalt, sondern an dieser Str\xf6mung, die noch gr\xf6\xdfer werden wird, denn die Leute haben immer mehr die Nase voll davon, sich sagen zu lassen "Papa, Mama, \xd6dipus, Kastration, Regression" und haben es satt f\xfcr die Sexualit\xe4t im allgemeinen - und ihre im besonderen - ein wirklich bl\xf6dsinniges Bild angeboten zu bekommen. Die Psychoanalytiker sollten, wie man sagt, die "Massen" ber\xfccksichtigen, die kleinen Massen.'

pattern = ur'[A-ZÄÖÜ][a-zäöüß-]*'
result = " ".join(re.findall(pattern, text))

解释:

  • [A-ZÄÖÜ] 匹配 A 和 Z 范围内的单个字符或字符 Ä、Ö 或 Ü。此字符后跟:

  • [a-zäöüß]+ 匹配 a 和 z 范围内的一个或多个字符或字符 ä、ö、ü 或 ß。

  • re.findall(...) 匹配所有出现的模式并返回匹配列表。

  • " ".join(...) 返回一个空格分隔的字符串,它是列表中单词的串联。

【讨论】:

    【解决方案2】:

    chacacter 类 [^A-Z] 将排除从 A 到 Z 的所有大写字母,但不排除大写变音符号 - 或不在该范围内的其他大写 unicode 字符。

    您可以使用re.findall 将字符串拆分为单个单词,然后检查它们是否以大写字母开头:

    >>> import re
    >>> text = u'Und Wenn die Psychoanalytiker, von den d\xfcmmsten bis zu den kl\xfcgsten, im allgemeinen feindselig auf dieses Buch reagiert haben, aber eher defensiv als aggressiv, so liegt das nat\xfcrlich nicht allein am Inhalt, sondern an dieser Str\xf6mung, die noch gr\xf6\xdfer werden wird, denn die Leute haben immer mehr die Nase voll davon, sich sagen zu lassen "Papa, Mama, \xd6dipus, Kastration, Regression" und haben es satt f\xfcr die Sexualit\xe4t im allgemeinen - und ihre im besonderen - ein wirklich bl\xf6dsinniges Bild angeboten zu bekommen. Die Psychoanalytiker sollten, wie man sagt, die "Massen" ber\xfccksichtigen, die kleinen Massen.'
    >>> [w for w in re.findall(r"\b\w+\b", text, re.U) if w[0].isupper()]
    [u'Und', u'Wenn', u'Psychoanalytiker', u'Buch', u'Inhalt', u'Str\xf6mung', u'Leute', u'Nase', u'Papa', u'Mama', u'\xd6dipus', u'Kastration', u'Regression', u'Sexualit\xe4t', u'Bild', u'Die', u'Psychoanalytiker', u'Massen', u'Massen']
    

    【讨论】:

      猜你喜欢
      • 2015-01-02
      • 2017-03-27
      • 2022-01-26
      • 2013-08-11
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多