从python unicode字符串中删除小写单词

时间:2014-05-24 18:12:06

标签: python regex unicode

我有一个像

这样的德语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)

但我对正则表达式来说是全新的

2 个答案:

答案 0 :(得分: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(...)返回一个以空格分隔的字符串,该字符串是列表中单词的串联。

答案 1 :(得分:0)

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']