1

I have a french regex, and there are accents on it.

I have a printed dictionary (not the pythonic data structure) : a list of words written in uppercase followed by there definition. I want to split my 20Mo dictionary by all the upper cases words.

The issue comes when I have a word itself composed of various words : I need to split the text following the suits of upper characters, with or without blanks. Furthermore the words can have accentuated character.

I have spent one day trying to make it happen, and could not find the answer.

Here is an example :

# -*- coding: utf-8 -*-
import codecs
import re
import string
print "debut pgm"
import regex



dico = """ARRHEMENT. s. m. L'action d'arrher. Achat de grains en vert et sur pied. ARRHER.v. a. S'assurer de quelque chose en donnant des arrhes. Arrher des marchandises.
Arrhé, ée. participe. ARRHES. s. f. pl. L'argent qu'on donne pour assurance de l'exécution d'un marché, et que l'on perd si lemarché n'a pas lieu par la faute de celui qui les a données. Le marché est−il conclu? donnez des arrhes. Il s'est engagé, il a pris des arrhes. Donner des arrhes au coche. •On dit familièrement, qu'On a donné des arrhes au coche, pour faire entendre qu'On s'est engagé dans quelque affaire, dans quelque société. Je ne puis
A 201"""

pattern = r'(?u)\p{Lu}+(?: \p{Lu}+)*|\p{Ll}+'

matches = regex.findall(pattern, dico)

n =0
i = 0

definition  = ""
mot         = ''
while i < len(matches):

    if matches[i].isupper() and len(matches[i])>1:
        print definition
        definition =""
        word         = matches[i]
        print "[",word,"]"
    else:
        definition  += matches[i] + " "

    i = i + 1

the result gives debut pgm

[ ARRHEMENT ]
s m L action d arrher A chat de grains en vert et sur pied 
[ ARRHER ]
v a S assurer de quelque chose en donnant des arrhes A rrher des marchandises A rrh ? ? e participe 
[ ARRHES ]

But I would like to keep the punctuation, (also to be able to detect the types (I have the list of the types like "s. m.")

I am sure it is crazily simple, so if you can help... Thanks, romain.

Romain Jouin
  • 4,448
  • 3
  • 49
  • 79

1 Answers1

3

edit: always using the new regex module, if you want to split your text into (word, type, definition), you can use this pattern:

# -*- coding: utf-8 -*-
import regex

data = u'''ARRHEMENT. s. m. L'action d'arrher. Achat de grains en vert et sur pied. ARRHER.v. a. S'assurer de quelque chose en donnant des arrhes. Arrher des marchandises. Arrhé, ée. participe. ARRHES. s. f. pl. L'argent qu'on donne pour assurance de l'exécution d'un marché, et que l'on perd si le marché n'a pas lieu par la faute de celui qui les a données. Le marché est−il conclu? donnez des arrhes. Il s'est engagé, il a pris des arrhes. Donner des arrhes au coche. •On dit'''

pattern = r'''(?usx)
    (?<word> \b \p{Lu}+ (?> [ ] \p{Lu}+ )* )
    \. [ ]?
    (?<type> [a-z]{1,3} \. (?> [a-z]{1,3} \. )*)
    [ ]
    (?<def> .*? ) (?=(?1)\.|$)'''

matches = regex.findall(pattern, data)

print matches

old answer:

The most simple is to use the new regex module instead of re. This module supports the character classes \p{Lu} for uppercase letters, \p{Ll} for lowercase letters. It supports the unicode flag (?u) too (The scope of this modifier is global, no need to put it on each part of the alternation). Example:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import regex

data = u'ARMÉ tu ARMÉE det PROPRÉTEUR def ÉTERNUER def À LA MALEHEURE test'


pattern = r'(?u)\p{Lu}+(?: \p{Lu}+)*|\p{Ll}+'

matches = regex.findall(pattern, data)

print matches
Casimir et Hippolyte
  • 88,009
  • 5
  • 94
  • 125
  • That's good, but I am loosing all the ponctuation sign now :( Any clue how to keep them ? – Romain Jouin Aug 02 '14 at 20:36
  • "ARRHEMENT. s. m. L'action d'arrher. Achat de grains en vert et sur pied. ARRHER.v. a. S'assurer de quelque chose en donnant des arrhes. Arrher des marchandises. Arrhé, ée. participe. ARRHES. s. f. pl. L'argent qu'on donne pour assurance de l'exécution d'un marché, et que l'on perd si le marché n'a pas lieu par la faute de celui qui les a données. Le marché est−il conclu? donnez des arrhes. Il s'est engagé, il a pris des arrhes. Donner des arrhes au coche. •On dit " – Romain Jouin Aug 02 '14 at 20:37
  • here before a more complete type of input : would be good to keep the dots :s – Romain Jouin Aug 02 '14 at 20:37
  • @user3318273: But what is your goal exactly? Do you want to put all words between square brackets? – Casimir et Hippolyte Aug 02 '14 at 20:49
  • euh.... no :( I am taking a file containing words definition, and I want to save in pythonic dictionary, like : – Romain Jouin Aug 02 '14 at 20:57
  • { "word" : "ARRHEMENT", "type" : "s. m. ", "definition" :"L'action d'arrher. Achat de grains en vert et sur pied. ARRHER.v. a. S'assurer de quelque chose en donnant des arrhes. Arrher des marchandises. Arrhé, ée. participe."} – Romain Jouin Aug 02 '14 at 20:59
  • @user3318273: OK, it's more clear now. Please udapte your question with that. – Casimir et Hippolyte Aug 02 '14 at 21:01
  • +1, @OP for reference about accented French letters also [see this](http://stackoverflow.com/a/24623419/1078583). – zx81 Aug 02 '14 at 21:40
  • Thanks :) Werdly it doesn't catch the type correctly :s it comes detached rather than together : `code`[(u'ARRHEMENT', u's.', u"m. L'action d'arrher. Achat de grains en vert et sur pi ed. "), (u'ARRHER', u'v.', u"a. S'assurer de quelque chose en donnant des arrhes . Arrher des marchandises. Arrh\xe9, \xe9e. participe. "), (u'', u's.', u"f. pl. L'argent qu'on donne pour assurance de l'ex\xe9cution d'un march\xe9, et que l' on perd si le march\xe9 n'a pas lieu par la faute de celui qui les a donn\xe9es. Donner des arrhes au coche. \u2022On dit")] `code` – Romain Jouin Aug 03 '14 at 09:06