niklas
niklas

Reputation: 3011

Remove lowercase words from python unicode string

I have a german unicode String like

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

that also contains Ü Ö Ä, and other german special chars. My aim is to get one string that only contains the words that start with a capital letter, as follows:

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

I have tried

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

but am totally new to regexes

Upvotes: 0

Views: 517

Answers (2)

miindlek
miindlek

Reputation: 3553

With re.sub(...) you replace every match with the string specified by the second parameter. I think what you want is:

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

Update

Here is an other solution. This one is a little bit more precise than my first one (especially for the german language).

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

Explanation:

  • [A-ZÄÖÜ] match a single character in the range between A and Z or the characters Ä, Ö or Ü. This character is followed by:

  • [a-zäöüß]+ match one ore more characters in the range between a and z or the characters ä, ö, ü or ß.

  • re.findall(...) matches all occurrences of a pattern and returns a list of matches.

  • " ".join(...) returns a whitespace-separated string which is the concatenation of the words in the list.

Upvotes: 1

mata
mata

Reputation: 69042

The chacacter class [^A-Z] will exclude all upper case letters from A to Z, but not an uppercase umlaut - or other uppercase unicode characters not in that range.

You can use re.findall to split your string into single words and then check wheather they start with an upper case letter:

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

Upvotes: 0

Related Questions