Reputation: 3011
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
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
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